From 99b96ec7375aae54004c82787e60646814f334ae Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 8 Feb 2013 15:58:12 -0800 Subject: [PATCH] build portaudio library to link with interface --- CMakeLists.txt | 1 - cmake/modules/FindPortaudio.cmake | 46 -- interface/CMakeLists.txt | 5 +- interface/src/Audio.cpp | 2 +- interface/src/Audio.h | 2 +- thirdparty/Portaudio/libportaudio.a | Bin 226072 -> 0 bytes thirdparty/Portaudio/portaudio.h | 1174 --------------------------- 7 files changed, 4 insertions(+), 1226 deletions(-) delete mode 100644 cmake/modules/FindPortaudio.cmake delete mode 100644 thirdparty/Portaudio/libportaudio.a delete mode 100644 thirdparty/Portaudio/portaudio.h diff --git a/CMakeLists.txt b/CMakeLists.txt index df1e4677d5..01fdfb91ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,6 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") project(hifi) set(GLM_ROOT_DIR ${CMAKE_SOURCE_DIR}/thirdparty) -set(PORTAUDIO_ROOT_DIR ${CMAKE_SOURCE_DIR}/thirdparty/Portaudio) set(LODEPNG_ROOT_DIR ${CMAKE_SOURCE_DIR}/thirdparty/LodePNG) add_subdirectory(interface) \ No newline at end of file diff --git a/cmake/modules/FindPortaudio.cmake b/cmake/modules/FindPortaudio.cmake deleted file mode 100644 index 01dae4b670..0000000000 --- a/cmake/modules/FindPortaudio.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# - Try to find the Portaudio library -# -# You must provide a PORTAUDIO_ROOT_DIR which contains the header and library -# -# Once done this will define -# -# PORTAUDIO_FOUND - system has Portaudio -# PORTAUDIO_INCLUDE_DIRS - the Portaudio include directory -# PORTAUDIO_LIBRARY - Link these to use Portaudio -# -# Copyright (c) 2013 Stephen Birarda -# -# Heavily based on Andreas Schneider's original FindPortaudio.cmake -# which can be found at http://gnuradio.org/redmine/projects/gnuradio/repository/ - - -if (PORTAUDIO_LIBRARY AND PORTAUDIO_INCLUDE_DIRS) - # in cache already - set(PORTAUDIO_FOUND TRUE) -else (PORTAUDIO_LIBRARY AND PORTAUDIO_INCLUDE_DIRS) - - set(PORTAUDIO_INCLUDE_DIRS - ${PORTAUDIO_ROOT_DIR}/portaudio.h - ) - set(PORTAUDIO_LIBRARY - ${PORTAUDIO_ROOT_DIR}/libportaudio.a - ) - - if (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARY) - set(PORTAUDIO_FOUND TRUE) - endif (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARY) - - if (PORTAUDIO_FOUND) - if (NOT Portaudio_FIND_QUIETLY) - message(STATUS "Found Portaudio: ${PORTAUDIO_LIBRARY}") - endif (NOT Portaudio_FIND_QUIETLY) - else (PORTAUDIO_FOUND) - if (Portaudio_FIND_REQUIRED) - message(FATAL_ERROR "Could not find Portaudio") - endif (Portaudio_FIND_REQUIRED) - endif (PORTAUDIO_FOUND) - - # show the PORTAUDIO_INCLUDE_DIRS and PORTAUDIO_LIBRARY variables only in the advanced view - mark_as_advanced(PORTAUDIO_INCLUDE_DIRS PORTAUDIO_LIBRARY) - -endif (PORTAUDIO_LIBRARY AND PORTAUDIO_INCLUDE_DIRS) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index f613359fef..3515972764 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -15,23 +15,22 @@ file(GLOB INTERFACE_SRCS src/*.cpp src/*.h) include_directories(${PROJECT_BINARY_DIR}/includes) add_executable(interface ${INTERFACE_SRCS}) +add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/portaudio thirdparty/portaudio) find_package(OpenGL REQUIRED) find_package(GLUT REQUIRED) find_package(GLM REQUIRED) -find_package(Portaudio REQUIRED) find_package(LodePNG REQUIRED) include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} ${GLM_INCLUDE_DIRS} - ${PORTAUDIO_INCLUDE_DIRS} ${LODEPNG_INCLUDE_DIRS} ) target_link_libraries(interface ${OPENGL_LIBRARY} ${GLUT_LIBRARY} - ${PORTAUDIO_LIBRARY} ${LODEPNG_LIBRARY} + portaudio_static ) \ No newline at end of file diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 13897cab87..01cc96c8f1 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -11,7 +11,7 @@ #include #include #include -#include g +#include #include "Audio.h" #include "Util.h" #include "AudioSource.h" diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 046a76f6b0..d61d0e59a2 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -10,7 +10,7 @@ #define __interface__Audio__ #include -#include +#include #include "Head.h" #include "AudioData.h" diff --git a/thirdparty/Portaudio/libportaudio.a b/thirdparty/Portaudio/libportaudio.a deleted file mode 100644 index bf03e6800991cb825fee3db4b583e6166f4dc5ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226072 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

Ey<6L?>_j9o_b^W;B| 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 MeL~cSJit5u1EyojM*si- diff --git a/thirdparty/Portaudio/portaudio.h b/thirdparty/Portaudio/portaudio.h deleted file mode 100644 index b80e1d1ef9..0000000000 --- a/thirdparty/Portaudio/portaudio.h +++ /dev/null @@ -1,1174 +0,0 @@ -#ifndef PORTAUDIO_H -#define PORTAUDIO_H -/* - * $Id: portaudio.h 1745 2011-08-25 17:44:01Z rossb $ - * PortAudio Portable Real-Time Audio Library - * PortAudio API Header File - * Latest version available at: http://www.portaudio.com/ - * - * Copyright (c) 1999-2002 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -/** @file - @ingroup public_header - @brief The portable PortAudio API. -*/ - - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - - -/** Retrieve the release number of the currently running PortAudio build, - eg 1900. -*/ -int Pa_GetVersion( void ); - - -/** Retrieve a textual description of the current PortAudio build, - eg "PortAudio V19-devel 13 October 2002". -*/ -const char* Pa_GetVersionText( void ); - - -/** Error codes returned by PortAudio functions. - Note that with the exception of paNoError, all PaErrorCodes are negative. -*/ - -typedef int PaError; -typedef enum PaErrorCode -{ - paNoError = 0, - - paNotInitialized = -10000, - paUnanticipatedHostError, - paInvalidChannelCount, - paInvalidSampleRate, - paInvalidDevice, - paInvalidFlag, - paSampleFormatNotSupported, - paBadIODeviceCombination, - paInsufficientMemory, - paBufferTooBig, - paBufferTooSmall, - paNullCallback, - paBadStreamPtr, - paTimedOut, - paInternalError, - paDeviceUnavailable, - paIncompatibleHostApiSpecificStreamInfo, - paStreamIsStopped, - paStreamIsNotStopped, - paInputOverflowed, - paOutputUnderflowed, - paHostApiNotFound, - paInvalidHostApi, - paCanNotReadFromACallbackStream, - paCanNotWriteToACallbackStream, - paCanNotReadFromAnOutputOnlyStream, - paCanNotWriteToAnInputOnlyStream, - paIncompatibleStreamHostApi, - paBadBufferPtr -} PaErrorCode; - - -/** Translate the supplied PortAudio error code into a human readable - message. -*/ -const char *Pa_GetErrorText( PaError errorCode ); - - -/** Library initialization function - call this before using PortAudio. - This function initializes internal data structures and prepares underlying - host APIs for use. With the exception of Pa_GetVersion(), Pa_GetVersionText(), - and Pa_GetErrorText(), this function MUST be called before using any other - PortAudio API functions. - - If Pa_Initialize() is called multiple times, each successful - call must be matched with a corresponding call to Pa_Terminate(). - Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not - required to be fully nested. - - Note that if Pa_Initialize() returns an error code, Pa_Terminate() should - NOT be called. - - @return paNoError if successful, otherwise an error code indicating the cause - of failure. - - @see Pa_Terminate -*/ -PaError Pa_Initialize( void ); - - -/** Library termination function - call this when finished using PortAudio. - This function deallocates all resources allocated by PortAudio since it was - initialized by a call to Pa_Initialize(). In cases where Pa_Initialise() has - been called multiple times, each call must be matched with a corresponding call - to Pa_Terminate(). The final matching call to Pa_Terminate() will automatically - close any PortAudio streams that are still open. - - Pa_Terminate() MUST be called before exiting a program which uses PortAudio. - Failure to do so may result in serious resource leaks, such as audio devices - not being available until the next reboot. - - @return paNoError if successful, otherwise an error code indicating the cause - of failure. - - @see Pa_Initialize -*/ -PaError Pa_Terminate( void ); - - - -/** The type used to refer to audio devices. Values of this type usually - range from 0 to (Pa_GetDeviceCount()-1), and may also take on the PaNoDevice - and paUseHostApiSpecificDeviceSpecification values. - - @see Pa_GetDeviceCount, paNoDevice, paUseHostApiSpecificDeviceSpecification -*/ -typedef int PaDeviceIndex; - - -/** A special PaDeviceIndex value indicating that no device is available, - or should be used. - - @see PaDeviceIndex -*/ -#define paNoDevice ((PaDeviceIndex)-1) - - -/** A special PaDeviceIndex value indicating that the device(s) to be used - are specified in the host api specific stream info structure. - - @see PaDeviceIndex -*/ -#define paUseHostApiSpecificDeviceSpecification ((PaDeviceIndex)-2) - - -/* Host API enumeration mechanism */ - -/** The type used to enumerate to host APIs at runtime. Values of this type - range from 0 to (Pa_GetHostApiCount()-1). - - @see Pa_GetHostApiCount -*/ -typedef int PaHostApiIndex; - - -/** Retrieve the number of available host APIs. Even if a host API is - available it may have no devices available. - - @return A non-negative value indicating the number of available host APIs - or, a PaErrorCode (which are always negative) if PortAudio is not initialized - or an error is encountered. - - @see PaHostApiIndex -*/ -PaHostApiIndex Pa_GetHostApiCount( void ); - - -/** Retrieve the index of the default host API. The default host API will be - the lowest common denominator host API on the current platform and is - unlikely to provide the best performance. - - @return A non-negative value ranging from 0 to (Pa_GetHostApiCount()-1) - indicating the default host API index or, a PaErrorCode (which are always - negative) if PortAudio is not initialized or an error is encountered. -*/ -PaHostApiIndex Pa_GetDefaultHostApi( void ); - - -/** Unchanging unique identifiers for each supported host API. This type - is used in the PaHostApiInfo structure. The values are guaranteed to be - unique and to never change, thus allowing code to be written that - conditionally uses host API specific extensions. - - New type ids will be allocated when support for a host API reaches - "public alpha" status, prior to that developers should use the - paInDevelopment type id. - - @see PaHostApiInfo -*/ -typedef enum PaHostApiTypeId -{ - paInDevelopment=0, /* use while developing support for a new host API */ - paDirectSound=1, - paMME=2, - paASIO=3, - paSoundManager=4, - paCoreAudio=5, - paOSS=7, - paALSA=8, - paAL=9, - paBeOS=10, - paWDMKS=11, - paJACK=12, - paWASAPI=13, - paAudioScienceHPI=14 -} PaHostApiTypeId; - - -/** A structure containing information about a particular host API. */ - -typedef struct PaHostApiInfo -{ - /** this is struct version 1 */ - int structVersion; - /** The well known unique identifier of this host API @see PaHostApiTypeId */ - PaHostApiTypeId type; - /** A textual description of the host API for display on user interfaces. */ - const char *name; - - /** The number of devices belonging to this host API. This field may be - used in conjunction with Pa_HostApiDeviceIndexToDeviceIndex() to enumerate - all devices for this host API. - @see Pa_HostApiDeviceIndexToDeviceIndex - */ - int deviceCount; - - /** The default input device for this host API. The value will be a - device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice - if no default input device is available. - */ - PaDeviceIndex defaultInputDevice; - - /** The default output device for this host API. The value will be a - device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice - if no default output device is available. - */ - PaDeviceIndex defaultOutputDevice; - -} PaHostApiInfo; - - -/** Retrieve a pointer to a structure containing information about a specific - host Api. - - @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1) - - @return A pointer to an immutable PaHostApiInfo structure describing - a specific host API. If the hostApi parameter is out of range or an error - is encountered, the function returns NULL. - - The returned structure is owned by the PortAudio implementation and must not - be manipulated or freed. The pointer is only guaranteed to be valid between - calls to Pa_Initialize() and Pa_Terminate(). -*/ -const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi ); - - -/** Convert a static host API unique identifier, into a runtime - host API index. - - @param type A unique host API identifier belonging to the PaHostApiTypeId - enumeration. - - @return A valid PaHostApiIndex ranging from 0 to (Pa_GetHostApiCount()-1) or, - a PaErrorCode (which are always negative) if PortAudio is not initialized - or an error is encountered. - - The paHostApiNotFound error code indicates that the host API specified by the - type parameter is not available. - - @see PaHostApiTypeId -*/ -PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type ); - - -/** Convert a host-API-specific device index to standard PortAudio device index. - This function may be used in conjunction with the deviceCount field of - PaHostApiInfo to enumerate all devices for the specified host API. - - @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1) - - @param hostApiDeviceIndex A valid per-host device index in the range - 0 to (Pa_GetHostApiInfo(hostApi)->deviceCount-1) - - @return A non-negative PaDeviceIndex ranging from 0 to (Pa_GetDeviceCount()-1) - or, a PaErrorCode (which are always negative) if PortAudio is not initialized - or an error is encountered. - - A paInvalidHostApi error code indicates that the host API index specified by - the hostApi parameter is out of range. - - A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter - is out of range. - - @see PaHostApiInfo -*/ -PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi, - int hostApiDeviceIndex ); - - - -/** Structure used to return information about a host error condition. -*/ -typedef struct PaHostErrorInfo{ - PaHostApiTypeId hostApiType; /**< the host API which returned the error code */ - long errorCode; /**< the error code returned */ - const char *errorText; /**< a textual description of the error if available, otherwise a zero-length string */ -}PaHostErrorInfo; - - -/** Return information about the last host error encountered. The error - information returned by Pa_GetLastHostErrorInfo() will never be modified - asynchronously by errors occurring in other PortAudio owned threads - (such as the thread that manages the stream callback.) - - This function is provided as a last resort, primarily to enhance debugging - by providing clients with access to all available error information. - - @return A pointer to an immutable structure constraining information about - the host error. The values in this structure will only be valid if a - PortAudio function has previously returned the paUnanticipatedHostError - error code. -*/ -const PaHostErrorInfo* Pa_GetLastHostErrorInfo( void ); - - - -/* Device enumeration and capabilities */ - -/** Retrieve the number of available devices. The number of available devices - may be zero. - - @return A non-negative value indicating the number of available devices or, - a PaErrorCode (which are always negative) if PortAudio is not initialized - or an error is encountered. -*/ -PaDeviceIndex Pa_GetDeviceCount( void ); - - -/** Retrieve the index of the default input device. The result can be - used in the inputDevice parameter to Pa_OpenStream(). - - @return The default input device index for the default host API, or paNoDevice - if no default input device is available or an error was encountered. -*/ -PaDeviceIndex Pa_GetDefaultInputDevice( void ); - - -/** Retrieve the index of the default output device. The result can be - used in the outputDevice parameter to Pa_OpenStream(). - - @return The default output device index for the default host API, or paNoDevice - if no default output device is available or an error was encountered. - - @note - 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". -*/ -PaDeviceIndex Pa_GetDefaultOutputDevice( void ); - - -/** The type used to represent monotonic time in seconds. PaTime is - used for the fields of the PaStreamCallbackTimeInfo argument to the - PaStreamCallback and as the result of Pa_GetStreamTime(). - - PaTime values have unspecified origin. - - @see PaStreamCallback, PaStreamCallbackTimeInfo, Pa_GetStreamTime -*/ -typedef double PaTime; - - -/** A type used to specify one or more sample formats. Each value indicates - a possible format for sound data passed to and from the stream callback, - Pa_ReadStream and Pa_WriteStream. - - The standard formats paFloat32, paInt16, paInt32, paInt24, paInt8 - and aUInt8 are usually implemented by all 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" - - The paNonInterleaved flag indicates that audio data is passed as an array - of pointers to separate buffers, one buffer for each channel. Usually, - when this flag is not used, audio data is passed as a single buffer with - all channels interleaved. - - @see Pa_OpenStream, Pa_OpenDefaultStream, PaDeviceInfo - @see paFloat32, paInt16, paInt32, paInt24, paInt8 - @see paUInt8, paCustomFormat, paNonInterleaved -*/ -typedef unsigned long PaSampleFormat; - - -#define paFloat32 ((PaSampleFormat) 0x00000001) /**< @see PaSampleFormat */ -#define paInt32 ((PaSampleFormat) 0x00000002) /**< @see PaSampleFormat */ -#define paInt24 ((PaSampleFormat) 0x00000004) /**< Packed 24 bit format. @see PaSampleFormat */ -#define paInt16 ((PaSampleFormat) 0x00000008) /**< @see PaSampleFormat */ -#define paInt8 ((PaSampleFormat) 0x00000010) /**< @see PaSampleFormat */ -#define paUInt8 ((PaSampleFormat) 0x00000020) /**< @see PaSampleFormat */ -#define paCustomFormat ((PaSampleFormat) 0x00010000) /**< @see PaSampleFormat */ - -#define paNonInterleaved ((PaSampleFormat) 0x80000000) /**< @see PaSampleFormat */ - -/** A structure providing information and capabilities of PortAudio devices. - Devices may support input, output or both input and output. -*/ -typedef struct PaDeviceInfo -{ - int structVersion; /* this is struct version 2 */ - const char *name; - PaHostApiIndex hostApi; /**< note this is a host API index, not a type id*/ - - int maxInputChannels; - int maxOutputChannels; - - /** Default latency values for interactive performance. */ - PaTime defaultLowInputLatency; - PaTime defaultLowOutputLatency; - /** Default latency values for robust non-interactive applications (eg. playing sound files). */ - PaTime defaultHighInputLatency; - PaTime defaultHighOutputLatency; - - double defaultSampleRate; -} PaDeviceInfo; - - -/** Retrieve a pointer to a PaDeviceInfo structure containing information - about the specified device. - @return A pointer to an immutable PaDeviceInfo structure. If the device - parameter is out of range the function returns NULL. - - @param device A valid device index in the range 0 to (Pa_GetDeviceCount()-1) - - @note 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(). - - @see PaDeviceInfo, PaDeviceIndex -*/ -const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device ); - - -/** Parameters for one direction (input or output) of a stream. -*/ -typedef struct PaStreamParameters -{ - /** A valid device index in the range 0 to (Pa_GetDeviceCount()-1) - specifying the device to be used or the special constant - paUseHostApiSpecificDeviceSpecification which indicates that the actual - device(s) to use are specified in hostApiSpecificStreamInfo. - This field must not be set to paNoDevice. - */ - PaDeviceIndex device; - - /** The number of channels of sound to be delivered to the - stream callback or accessed by Pa_ReadStream() or Pa_WriteStream(). - It can range from 1 to the value of maxInputChannels in the - PaDeviceInfo record for the device specified by the device parameter. - */ - int channelCount; - - /** The sample format of the buffer provided to the stream callback, - a_ReadStream() or Pa_WriteStream(). It may be any of the formats described - by the PaSampleFormat enumeration. - */ - PaSampleFormat sampleFormat; - - /** The desired latency in seconds. Where practical, implementations should - configure their latency based on these parameters, otherwise they may - choose the closest viable latency instead. Unless the suggested latency - is greater than the absolute upper limit for the device implementations - should round the suggestedLatency up to the next practical value - ie to - provide an equal or higher latency than suggestedLatency wherever possible. - Actual latency values for an open stream may be retrieved using the - inputLatency and outputLatency fields of the PaStreamInfo structure - returned by Pa_GetStreamInfo(). - @see default*Latency in PaDeviceInfo, *Latency in PaStreamInfo - */ - PaTime suggestedLatency; - - /** An optional pointer to a host api specific data structure - containing additional information for device setup and/or stream processing. - hostApiSpecificStreamInfo is never required for correct operation, - if not used it should be set to NULL. - */ - void *hostApiSpecificStreamInfo; - -} PaStreamParameters; - - -/** Return code for Pa_IsFormatSupported indicating success. */ -#define paFormatIsSupported (0) - -/** Determine whether it would be possible to open a stream with the specified - parameters. - - @param inputParameters A structure that describes the input parameters used to - open a stream. The suggestedLatency field is ignored. See PaStreamParameters - for a description of these parameters. inputParameters must be NULL for - output-only streams. - - @param outputParameters A structure that describes the output parameters used - to open a stream. The suggestedLatency field is ignored. See PaStreamParameters - for a description of these parameters. outputParameters must be NULL for - input-only streams. - - @param sampleRate The required sampleRate. For full-duplex streams it is the - sample rate for both input and output - - @return Returns 0 if the format is supported, and an error code indicating why - the format is not supported otherwise. The constant paFormatIsSupported is - provided to compare with the return value for success. - - @see paFormatIsSupported, PaStreamParameters -*/ -PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters, - const PaStreamParameters *outputParameters, - double sampleRate ); - - - -/* Streaming types and functions */ - - -/** - A single PaStream can provide multiple channels of real-time - streaming audio input and output to a client application. A stream - provides access to audio hardware represented by one or more - PaDevices. Depending on the underlying Host API, it may be possible - to open multiple streams using the same device, however this behavior - is implementation defined. Portable applications should assume that - a PaDevice may be simultaneously used by at most one PaStream. - - Pointers to PaStream objects are passed between PortAudio functions that - operate on streams. - - @see Pa_OpenStream, Pa_OpenDefaultStream, Pa_OpenDefaultStream, Pa_CloseStream, - Pa_StartStream, Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive, - Pa_GetStreamTime, Pa_GetStreamCpuLoad - -*/ -typedef void PaStream; - - -/** Can be passed as the framesPerBuffer parameter to Pa_OpenStream() - or Pa_OpenDefaultStream() to indicate that the stream callback will - accept buffers of any size. -*/ -#define paFramesPerBufferUnspecified (0) - - -/** Flags used to control the behavior of a stream. They are passed as - parameters to Pa_OpenStream or Pa_OpenDefaultStream. Multiple flags may be - ORed together. - - @see Pa_OpenStream, Pa_OpenDefaultStream - @see paNoFlag, paClipOff, paDitherOff, paNeverDropInput, - paPrimeOutputBuffersUsingStreamCallback, paPlatformSpecificFlags -*/ -typedef unsigned long PaStreamFlags; - -/** @see PaStreamFlags */ -#define paNoFlag ((PaStreamFlags) 0) - -/** Disable default clipping of out of range samples. - @see PaStreamFlags -*/ -#define paClipOff ((PaStreamFlags) 0x00000001) - -/** Disable default dithering. - @see PaStreamFlags -*/ -#define paDitherOff ((PaStreamFlags) 0x00000002) - -/** Flag requests that where possible a full duplex stream will not discard - overflowed input samples without calling the stream callback. This flag is - only valid for full duplex callback streams and only when used in combination - with the paFramesPerBufferUnspecified (0) framesPerBuffer parameter. Using - this flag incorrectly results in a paInvalidFlag error being returned from - Pa_OpenStream and Pa_OpenDefaultStream. - - @see PaStreamFlags, paFramesPerBufferUnspecified -*/ -#define paNeverDropInput ((PaStreamFlags) 0x00000004) - -/** Call the stream callback to fill initial output buffers, rather than the - default behavior of priming the buffers with zeros (silence). This flag has - no effect for input-only and blocking read/write streams. - - @see PaStreamFlags -*/ -#define paPrimeOutputBuffersUsingStreamCallback ((PaStreamFlags) 0x00000008) - -/** A mask specifying the platform specific bits. - @see PaStreamFlags -*/ -#define paPlatformSpecificFlags ((PaStreamFlags)0xFFFF0000) - -/** - Timing information for the buffers passed to the stream callback. - - Time values are expressed in seconds and are synchronised with the time base used by Pa_GetStreamTime() for the associated stream. - - @see PaStreamCallback, Pa_GetStreamTime -*/ -typedef struct PaStreamCallbackTimeInfo{ - PaTime inputBufferAdcTime; /**< The time when the first sample of the input buffer was captured at the ADC input */ - PaTime currentTime; /**< The time when the stream callback was invoked */ - PaTime outputBufferDacTime; /**< The time when the first sample of the output buffer will output the DAC */ -} PaStreamCallbackTimeInfo; - - -/** - Flag bit constants for the statusFlags to PaStreamCallback. - - @see paInputUnderflow, paInputOverflow, paOutputUnderflow, paOutputOverflow, - paPrimingOutput -*/ -typedef unsigned long PaStreamCallbackFlags; - -/** In a stream opened with paFramesPerBufferUnspecified, indicates that - input data is all silence (zeros) because no real data is available. In a - stream opened without paFramesPerBufferUnspecified, it indicates that one or - more zero samples have been inserted into the input buffer to compensate - for an input underflow. - @see PaStreamCallbackFlags -*/ -#define paInputUnderflow ((PaStreamCallbackFlags) 0x00000001) - -/** In a stream opened with paFramesPerBufferUnspecified, indicates that data - prior to the first sample of the input buffer was discarded due to an - overflow, possibly because the stream callback is using too much CPU time. - Otherwise indicates that data prior to one or more samples in the - input buffer was discarded. - @see PaStreamCallbackFlags -*/ -#define paInputOverflow ((PaStreamCallbackFlags) 0x00000002) - -/** Indicates that output data (or a gap) was inserted, possibly because the - stream callback is using too much CPU time. - @see PaStreamCallbackFlags -*/ -#define paOutputUnderflow ((PaStreamCallbackFlags) 0x00000004) - -/** Indicates that output data will be discarded because no room is available. - @see PaStreamCallbackFlags -*/ -#define paOutputOverflow ((PaStreamCallbackFlags) 0x00000008) - -/** Some of all of the output data will be used to prime the stream, input - data may be zero. - @see PaStreamCallbackFlags -*/ -#define paPrimingOutput ((PaStreamCallbackFlags) 0x00000010) - -/** - Allowable return values for the PaStreamCallback. - @see PaStreamCallback -*/ -typedef enum PaStreamCallbackResult -{ - paContinue=0, /**< Signal that the stream should continue invoking the callback and processing audio. */ - paComplete=1, /**< Signal that the stream should stop invoking the callback and finish once all output samples have played. */ - paAbort=2 /**< Signal that the stream should stop invoking the callback and finish as soon as possible. */ -} PaStreamCallbackResult; - - -/** - Functions of type PaStreamCallback are implemented by PortAudio clients. - They consume, process or generate audio in response to requests from an - active PortAudio stream. - - When a stream is running, PortAudio calls the stream callback periodically. - The callback function is responsible for processing buffers of audio samples - passed via the input and output parameters. - - The PortAudio stream callback runs at very high or real-time priority. - It is required to consistently meet its time deadlines. Do not allocate - memory, access the file system, call library functions or call other functions - from the stream callback that may block or take an unpredictable amount of - time to complete. - - In order for a stream to maintain glitch-free operation the callback - must consume and return audio data faster than it is recorded and/or - played. PortAudio anticipates that each callback invocation may execute for - a duration approaching the duration of frameCount audio frames at the stream - sample rate. It is reasonable to expect to be able to utilise 70% or more of - the available CPU time in the PortAudio callback. However, due to buffer size - adaption and other factors, not all host APIs are able to guarantee audio - stability under heavy CPU load with arbitrary fixed callback buffer sizes. - When high callback CPU utilisation is required the most robust behavior - can be achieved by using paFramesPerBufferUnspecified as the - Pa_OpenStream() framesPerBuffer parameter. - - @param input and @param output are either arrays of interleaved samples or; - if non-interleaved samples were requested using the paNonInterleaved sample - format flag, an array of buffer pointers, one non-interleaved buffer for - each channel. - - The format, packing and number of channels used by the buffers are - determined by parameters to Pa_OpenStream(). - - @param frameCount The number of sample frames to be processed by - the stream callback. - - @param timeInfo Timestamps indicating the ADC capture time of the first sample - in the input buffer, the DAC output time of the first sample in the output buffer - and the time the callback was invoked. - See PaStreamCallbackTimeInfo and Pa_GetStreamTime() - - @param statusFlags Flags indicating whether input and/or output buffers - have been inserted or will be dropped to overcome underflow or overflow - conditions. - - @param userData The value of a user supplied pointer passed to - Pa_OpenStream() intended for storing synthesis data etc. - - @return - The stream callback should return one of the values in the - ::PaStreamCallbackResult enumeration. To ensure that the callback continues - to be called, it should return paContinue (0). Either paComplete or paAbort - can be returned to finish stream processing, after either of these values is - returned the callback will not be called again. If paAbort is returned the - stream will finish as soon as possible. If paComplete is returned, the stream - will continue until all buffers generated by the callback have been played. - This may be useful in applications such as soundfile players where a specific - duration of output is required. However, it is not necessary to utilize this - mechanism as Pa_StopStream(), Pa_AbortStream() or Pa_CloseStream() can also - be used to stop the stream. The callback must always fill the entire output - buffer irrespective of its return value. - - @see Pa_OpenStream, Pa_OpenDefaultStream - - @note With the exception of Pa_GetStreamCpuLoad() it is not permissible to call - PortAudio API functions from within the stream callback. -*/ -typedef int PaStreamCallback( - const void *input, void *output, - unsigned long frameCount, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData ); - - -/** Opens a stream for either input, output or both. - - @param stream The address of a PaStream pointer which will receive - a pointer to the newly opened stream. - - @param inputParameters A structure that describes the input parameters used by - the opened stream. See PaStreamParameters for a description of these parameters. - inputParameters must be NULL for output-only streams. - - @param outputParameters A structure that describes the output parameters used by - the opened stream. See PaStreamParameters for a description of these parameters. - outputParameters must be NULL for input-only streams. - - @param sampleRate The desired sampleRate. For full-duplex streams it is the - sample rate for both input and output - - @param framesPerBuffer The number of frames passed to the stream callback - function, or the preferred block granularity for a blocking read/write stream. - The special value paFramesPerBufferUnspecified (0) may be used to request that - the stream callback will receive an optimal (and possibly varying) number of - frames based on host requirements and the requested latency settings. - Note: With some host APIs, the use of non-zero framesPerBuffer for a callback - stream may introduce an additional layer of buffering which could introduce - additional latency. PortAudio guarantees that the additional latency - will be kept to the theoretical minimum however, it is strongly recommended - that a non-zero framesPerBuffer value only be used when your algorithm - requires a fixed number of frames per stream callback. - - @param streamFlags Flags which modify the behavior of the streaming process. - This parameter may contain a combination of flags ORed together. Some flags may - only be relevant to certain buffer formats. - - @param streamCallback A pointer to a client supplied function that is responsible - for processing and filling input and output buffers. If this parameter is NULL - the stream will be opened in 'blocking read/write' mode. In blocking mode, - the client can receive sample data using Pa_ReadStream and write sample data - using Pa_WriteStream, the number of samples that may be read or written - without blocking is returned by Pa_GetStreamReadAvailable and - Pa_GetStreamWriteAvailable respectively. - - @param userData A client supplied pointer which is passed to the stream callback - function. It could for example, contain a pointer to instance data necessary - for processing the audio buffers. This parameter is ignored if streamCallback - is NULL. - - @return - Upon success Pa_OpenStream() returns paNoError and places a pointer to a - valid PaStream 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 for possible error codes) and the value of stream is invalid. - - @see PaStreamParameters, PaStreamCallback, Pa_ReadStream, Pa_WriteStream, - Pa_GetStreamReadAvailable, Pa_GetStreamWriteAvailable -*/ -PaError Pa_OpenStream( PaStream** stream, - const PaStreamParameters *inputParameters, - const PaStreamParameters *outputParameters, - double sampleRate, - unsigned long framesPerBuffer, - PaStreamFlags streamFlags, - PaStreamCallback *streamCallback, - void *userData ); - - -/** A simplified version of Pa_OpenStream() that opens the default input - and/or output devices. - - @param stream The address of a PaStream pointer which will receive - a pointer to the newly opened stream. - - @param numInputChannels The number of channels of sound that will be supplied - to the stream callback or returned by Pa_ReadStream. It can range from 1 to - the value of maxInputChannels in the PaDeviceInfo record for the default input - device. If 0 the stream is opened as an output-only stream. - - @param numOutputChannels The number of channels of sound to be delivered to the - stream callback or passed to Pa_WriteStream. It can range from 1 to the value - of maxOutputChannels in the PaDeviceInfo record for the default output device. - If 0 the stream is opened as an output-only stream. - - @param sampleFormat The sample format of both the input and output buffers - provided to the callback or passed to and from Pa_ReadStream and Pa_WriteStream. - sampleFormat may be any of the formats described by the PaSampleFormat - enumeration. - - @param sampleRate Same as Pa_OpenStream parameter of the same name. - @param framesPerBuffer Same as Pa_OpenStream parameter of the same name. - @param streamCallback Same as Pa_OpenStream parameter of the same name. - @param userData Same as Pa_OpenStream parameter of the same name. - - @return As for Pa_OpenStream - - @see Pa_OpenStream, PaStreamCallback -*/ -PaError Pa_OpenDefaultStream( PaStream** stream, - int numInputChannels, - int numOutputChannels, - PaSampleFormat sampleFormat, - double sampleRate, - unsigned long framesPerBuffer, - PaStreamCallback *streamCallback, - void *userData ); - - -/** Closes an audio stream. If the audio stream is active it - discards any pending buffers as if Pa_AbortStream() had been called. -*/ -PaError Pa_CloseStream( PaStream *stream ); - - -/** Functions of type PaStreamFinishedCallback are implemented by PortAudio - clients. They can be registered with a stream using the Pa_SetStreamFinishedCallback - function. Once registered they are called when the stream becomes inactive - (ie once a call to Pa_StopStream() will not block). - A stream will become inactive after the stream callback returns non-zero, - or when Pa_StopStream or Pa_AbortStream is called. For a stream providing audio - output, if the stream callback returns paComplete, or Pa_StopStream is called, - the stream finished callback will not be called until all generated sample data - has been played. - - @param userData The userData parameter supplied to Pa_OpenStream() - - @see Pa_SetStreamFinishedCallback -*/ -typedef void PaStreamFinishedCallback( void *userData ); - - -/** Register a stream finished callback function which will be called when the - stream becomes inactive. See the description of PaStreamFinishedCallback for - further details about when the callback will be called. - - @param stream a pointer to a PaStream that is in the stopped state - if the - stream is not stopped, the stream's finished callback will remain unchanged - and an error code will be returned. - - @param streamFinishedCallback a pointer to a function with the same signature - as PaStreamFinishedCallback, that will be called when the stream becomes - inactive. Passing NULL for this parameter will un-register a previously - registered stream finished callback function. - - @return on success returns paNoError, otherwise an error code indicating the cause - of the error. - - @see PaStreamFinishedCallback -*/ -PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); - - -/** Commences audio processing. -*/ -PaError Pa_StartStream( PaStream *stream ); - - -/** Terminates audio processing. It waits until all pending - audio buffers have been played before it returns. -*/ -PaError Pa_StopStream( PaStream *stream ); - - -/** Terminates audio processing immediately without waiting for pending - buffers to complete. -*/ -PaError Pa_AbortStream( PaStream *stream ); - - -/** Determine whether the stream is stopped. - A stream is considered to be stopped prior to a successful call to - Pa_StartStream and after a successful call to Pa_StopStream or Pa_AbortStream. - If a stream callback returns a value other than paContinue the stream is NOT - considered to be stopped. - - @return Returns one (1) when the stream is stopped, zero (0) when - the stream is running or, a PaErrorCode (which are always negative) if - PortAudio is not initialized or an error is encountered. - - @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive -*/ -PaError Pa_IsStreamStopped( PaStream *stream ); - - -/** Determine whether the stream is active. - A stream is active after a successful call to Pa_StartStream(), until it - becomes inactive either as a result of a call to Pa_StopStream() or - Pa_AbortStream(), or as a result of a return value other than paContinue from - the stream callback. In the latter case, the stream is considered inactive - after the last buffer has finished playing. - - @return Returns one (1) when the stream is active (ie playing or recording - audio), zero (0) when not playing or, a PaErrorCode (which are always negative) - if PortAudio is not initialized or an error is encountered. - - @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamStopped -*/ -PaError Pa_IsStreamActive( PaStream *stream ); - - - -/** A structure containing unchanging information about an open stream. - @see Pa_GetStreamInfo -*/ - -typedef struct PaStreamInfo -{ - /** this is struct version 1 */ - int structVersion; - - /** The input latency of the stream in seconds. This value provides the most - accurate estimate of input latency available to the implementation. It may - differ significantly from the suggestedLatency value passed to Pa_OpenStream(). - The value of this field will be zero (0.) for output-only streams. - @see PaTime - */ - PaTime inputLatency; - - /** The output latency of the stream in seconds. This value provides the most - accurate estimate of output latency available to the implementation. It may - differ significantly from the suggestedLatency value passed to Pa_OpenStream(). - The value of this field will be zero (0.) for input-only streams. - @see PaTime - */ - PaTime outputLatency; - - /** The sample rate of the stream in Hertz (samples per second). In cases - where the hardware sample rate is inaccurate and PortAudio is aware of it, - the value of this field may be different from the sampleRate parameter - passed to Pa_OpenStream(). If information about the actual hardware sample - rate is not available, this field will have the same value as the sampleRate - parameter passed to Pa_OpenStream(). - */ - double sampleRate; - -} PaStreamInfo; - - -/** Retrieve a pointer to a PaStreamInfo structure containing information - about the specified stream. - @return A pointer to an immutable PaStreamInfo structure. If the stream - parameter invalid, or an error is encountered, the function returns NULL. - - @param stream A pointer to an open stream previously created with Pa_OpenStream. - - @note 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 until the specified stream is closed. - - @see PaStreamInfo -*/ -const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream ); - - -/** Returns the current time in seconds for a stream according to the same clock used - to generate callback PaStreamCallbackTimeInfo timestamps. The time values are - monotonically increasing and have unspecified origin. - - Pa_GetStreamTime returns valid time values for the entire life of the stream, - from when the stream is opened until it is closed. Starting and stopping the stream - does not affect the passage of time returned by Pa_GetStreamTime. - - This time may be used for synchronizing other events to the audio stream, for - example synchronizing audio to MIDI. - - @return The stream's current time in seconds, or 0 if an error occurred. - - @see PaTime, PaStreamCallback, PaStreamCallbackTimeInfo -*/ -PaTime Pa_GetStreamTime( PaStream *stream ); - - -/** Retrieve CPU usage information for the specified stream. - The "CPU Load" is a fraction of total CPU time consumed by a callback stream's - audio processing routines including, but not limited to the client supplied - stream callback. This function does not work with blocking read/write streams. - - This function may be called from the stream callback function or the - application. - - @return - A floating point value, typically between 0.0 and 1.0, where 1.0 indicates - that the stream callback is consuming the maximum number of CPU cycles possible - to maintain real-time operation. A value of 0.5 would imply that PortAudio and - the stream callback was consuming roughly 50% of the available CPU time. The - return value may exceed 1.0. A value of 0.0 will always be returned for a - blocking read/write stream, or if an error occurs. -*/ -double Pa_GetStreamCpuLoad( PaStream* stream ); - - -/** Read samples from an input stream. The function doesn't return until - the entire buffer has been filled - this may involve waiting for the operating - system to supply the data. - - @param stream A pointer to an open stream previously created with Pa_OpenStream. - - @param buffer A pointer to a buffer of sample frames. The buffer contains - samples in the format specified by the inputParameters->sampleFormat field - used to open the stream, and the number of channels specified by - inputParameters->numChannels. If non-interleaved samples were requested using - the paNonInterleaved sample format flag, buffer is a pointer to the first element - of an array of buffer pointers, one non-interleaved buffer for each channel. - - @param frames The number of frames to be read into buffer. This parameter - is not constrained to a specific range, however high performance applications - will want to match this parameter to the framesPerBuffer parameter used - when opening the stream. - - @return On success PaNoError will be returned, or PaInputOverflowed if input - data was discarded by PortAudio after the previous call and before this call. -*/ -PaError Pa_ReadStream( PaStream* stream, - void *buffer, - unsigned long frames ); - - -/** Write samples to an output stream. This function doesn't return until the - entire buffer has been consumed - this may involve waiting for the operating - system to consume the data. - - @param stream A pointer to an open stream previously created with Pa_OpenStream. - - @param buffer A pointer to a buffer of sample frames. The buffer contains - samples in the format specified by the outputParameters->sampleFormat field - used to open the stream, and the number of channels specified by - outputParameters->numChannels. If non-interleaved samples were requested using - the paNonInterleaved sample format flag, buffer is a pointer to the first element - of an array of buffer pointers, one non-interleaved buffer for each channel. - - @param frames The number of frames to be written from buffer. This parameter - is not constrained to a specific range, however high performance applications - will want to match this parameter to the framesPerBuffer parameter used - when opening the stream. - - @return On success PaNoError will be returned, or paOutputUnderflowed if - additional output data was inserted after the previous call and before this - call. -*/ -PaError Pa_WriteStream( PaStream* stream, - const void *buffer, - unsigned long frames ); - - -/** Retrieve the number of frames that can be read from the stream without - waiting. - - @return Returns a non-negative value representing the maximum number of frames - that can be read from the stream without blocking or busy waiting or, a - PaErrorCode (which are always negative) if PortAudio is not initialized or an - error is encountered. -*/ -signed long Pa_GetStreamReadAvailable( PaStream* stream ); - - -/** Retrieve the number of frames that can be written to the stream without - waiting. - - @return Returns a non-negative value representing the maximum number of frames - that can be written to the stream without blocking or busy waiting or, a - PaErrorCode (which are always negative) if PortAudio is not initialized or an - error is encountered. -*/ -signed long Pa_GetStreamWriteAvailable( PaStream* stream ); - - -/* Miscellaneous utilities */ - - -/** Retrieve the size of a given sample format in bytes. - - @return The size in bytes of a single sample in the specified format, - or paSampleFormatNotSupported if the format is not supported. -*/ -PaError Pa_GetSampleSize( PaSampleFormat format ); - - -/** Put the caller to sleep for at least 'msec' milliseconds. This function is - provided only as a convenience for authors of portable code (such as the tests - and examples in the PortAudio distribution.) - - The function may sleep longer than requested so don't rely on this for accurate - musical timing. -*/ -void Pa_Sleep( long msec ); - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* PORTAUDIO_H */