summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/portaudio/include
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/portaudio/include')
-rw-r--r--3rdparty/portaudio/include/pa_asio.h18
-rw-r--r--3rdparty/portaudio/include/pa_jack.h6
-rw-r--r--3rdparty/portaudio/include/pa_linux_alsa.h6
-rw-r--r--3rdparty/portaudio/include/pa_linux_pulseaudio.h79
-rw-r--r--3rdparty/portaudio/include/pa_mac_core.h26
-rw-r--r--3rdparty/portaudio/include/pa_win_ds.h14
-rw-r--r--3rdparty/portaudio/include/pa_win_wasapi.h579
-rw-r--r--3rdparty/portaudio/include/pa_win_waveformat.h162
-rw-r--r--3rdparty/portaudio/include/pa_win_wdmks.h8
-rw-r--r--3rdparty/portaudio/include/pa_win_wmme.h18
-rw-r--r--3rdparty/portaudio/include/portaudio.h152
11 files changed, 769 insertions, 299 deletions
diff --git a/3rdparty/portaudio/include/pa_asio.h b/3rdparty/portaudio/include/pa_asio.h
index 9c606a9c7ce..27cbd3b81c9 100644
--- a/3rdparty/portaudio/include/pa_asio.h
+++ b/3rdparty/portaudio/include/pa_asio.h
@@ -28,13 +28,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
@@ -52,7 +52,7 @@ extern "C"
#endif /* __cplusplus */
-/** Retrieve legal native buffer sizes for the specificed device, in sample frames.
+/** Retrieve legal native buffer sizes for the specified device, in sample frames.
@param device The global index of the device about which the query is being made.
@param minBufferSizeFrames A pointer to the location which will receive the minimum buffer size value.
@@ -68,7 +68,7 @@ extern "C"
#define that maps PaAsio_GetAvailableLatencyValues to this function for backwards compatibility.
*/
PaError PaAsio_GetAvailableBufferSizes( PaDeviceIndex device,
- long *minBufferSizeFrames, long *maxBufferSizeFrames, long *preferredBufferSizeFrames, long *granularity );
+ long *minBufferSizeFrames, long *maxBufferSizeFrames, long *preferredBufferSizeFrames, long *granularity );
/** Backwards compatibility alias for PaAsio_GetAvailableBufferSizes
@@ -97,7 +97,7 @@ PaError PaAsio_ShowControlPanel( PaDeviceIndex device, void* systemSpecific );
PaError PaAsio_GetInputChannelName( PaDeviceIndex device, int channelIndex,
const char** channelName );
-
+
/** Retrieve a pointer to a string containing the name of the specified
input channel. The string is valid until Pa_Terminate is called.
@@ -108,11 +108,11 @@ PaError PaAsio_GetOutputChannelName( PaDeviceIndex device, int channelIndex,
/** Set the sample rate of an open paASIO stream.
-
+
@param stream The stream to operate on.
- @param sampleRate The new sample rate.
+ @param sampleRate The new sample rate.
- Note that this function may fail if the stream is alredy running and the
+ Note that this function may fail if the stream is already running and the
ASIO driver does not support switching the sample rate of a running stream.
Returns paIncompatibleStreamHostApi if stream is not a paASIO stream.
diff --git a/3rdparty/portaudio/include/pa_jack.h b/3rdparty/portaudio/include/pa_jack.h
index 99ef833dd0b..750d116ce73 100644
--- a/3rdparty/portaudio/include/pa_jack.h
+++ b/3rdparty/portaudio/include/pa_jack.h
@@ -29,13 +29,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
diff --git a/3rdparty/portaudio/include/pa_linux_alsa.h b/3rdparty/portaudio/include/pa_linux_alsa.h
index 7ac67364567..c9406156390 100644
--- a/3rdparty/portaudio/include/pa_linux_alsa.h
+++ b/3rdparty/portaudio/include/pa_linux_alsa.h
@@ -29,13 +29,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
diff --git a/3rdparty/portaudio/include/pa_linux_pulseaudio.h b/3rdparty/portaudio/include/pa_linux_pulseaudio.h
new file mode 100644
index 00000000000..7c5dfce05fd
--- /dev/null
+++ b/3rdparty/portaudio/include/pa_linux_pulseaudio.h
@@ -0,0 +1,79 @@
+#ifndef PA_LINUX_PULSEAUDIO_H
+#define PA_LINUX_PULSEAUDIO_H
+
+/*
+ * $Id$
+ * PortAudio Portable Real-Time Audio Library
+ * PulseAudio-specific extensions
+ *
+ * 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.
+ *
+ * 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 PulseAudio-specific PortAudio API extension header file.
+ */
+
+#include "portaudio.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Renames the PulseAudio description for the source that is opened
+ * by PortAudio.
+ *
+ * @param s The PortAudio stream to operate on.
+ * @param streamName The new name/description of the source.
+ *
+ * @return paNoError on success or the error encountered otherwise.
+ */
+PaError PaPulseAudio_RenameSource( PaStream *s, const char *streamName );
+
+/**
+ * Renames the PulseAudio description for the sink that is opened
+ * by PortAudio.
+ *
+ * @param s The PortAudio stream to operate on.
+ * @param streamName The new name/description of the sink.
+ *
+ * @return paNoError on success or the error encountered otherwise.
+ */
+PaError PaPulseAudio_RenameSink( PaStream *s, const char *streamName );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/3rdparty/portaudio/include/pa_mac_core.h b/3rdparty/portaudio/include/pa_mac_core.h
index 83e40a6ac5b..beb539619a1 100644
--- a/3rdparty/portaudio/include/pa_mac_core.h
+++ b/3rdparty/portaudio/include/pa_mac_core.h
@@ -28,13 +28,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
@@ -66,8 +66,8 @@ typedef struct
PaHostApiTypeId hostApiType; /**host API for which this data is intended */
unsigned long version; /**structure version */
unsigned long flags; /** flags to modify behaviour */
- SInt32 const * channelMap; /** Channel map for HAL channel mapping , if not needed, use NULL;*/
- unsigned long channelMapSize; /** Channel map size for HAL channel mapping , if not needed, use 0;*/
+ SInt32 const * channelMap; /** Channel map for HAL channel mapping , if not needed, use NULL;*/
+ unsigned long channelMapSize; /** Channel map size for HAL channel mapping , if not needed, use 0;*/
} PaMacCoreStreamInfo;
/**
@@ -98,7 +98,7 @@ void PaMacCore_SetupChannelMap( PaMacCoreStreamInfo *data, const SInt32 * const
* @return A valid AudioDeviceID, or NULL if an error occurred.
*/
AudioDeviceID PaMacCore_GetStreamInputDevice( PaStream* s );
-
+
/**
* Retrieve the AudioDeviceID of the output device assigned to an open stream
*
@@ -112,25 +112,25 @@ AudioDeviceID PaMacCore_GetStreamOutputDevice( PaStream* s );
* Returns a statically allocated string with the device's name
* for the given channel. NULL will be returned on failure.
*
- * This function's implemenation is not complete!
+ * This function's implementation is not complete!
*
* @param device The PortAudio device index.
* @param channel The channel number who's name is requested.
* @return a statically allocated string with the name of the device.
* Because this string is statically allocated, it must be
- * coppied if it is to be saved and used by the user after
+ * copied if it is to be saved and used by the user after
* another call to this function.
*
*/
const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input );
-
-/** Retrieve the range of legal native buffer sizes for the specificed device, in sample frames.
-
+
+/** Retrieve the range of legal native buffer sizes for the specified device, in sample frames.
+
@param device The global index of the PortAudio device about which the query is being made.
@param minBufferSizeFrames A pointer to the location which will receive the minimum buffer size value.
@param maxBufferSizeFrames A pointer to the location which will receive the maximum buffer size value.
-
+
@see kAudioDevicePropertyBufferFrameSizeRange in the CoreAudio SDK.
*/
PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device,
@@ -158,7 +158,7 @@ PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device,
* are supported by the device. */
#define paMacCoreFailIfConversionRequired (0x02)
-/** These flags set the SR conversion quality, if required. The wierd ordering
+/** These flags set the SR conversion quality, if required. The weird ordering
* allows Maximum Quality to be the default.*/
#define paMacCoreConversionQualityMin (0x0100)
#define paMacCoreConversionQualityMedium (0x0200)
diff --git a/3rdparty/portaudio/include/pa_win_ds.h b/3rdparty/portaudio/include/pa_win_ds.h
index 5d3864168c4..8081abd3036 100644
--- a/3rdparty/portaudio/include/pa_win_ds.h
+++ b/3rdparty/portaudio/include/pa_win_ds.h
@@ -28,13 +28,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
@@ -63,11 +63,11 @@ typedef struct PaWinDirectSoundStreamInfo{
unsigned long flags; /**< enable other features of this struct */
- /**
+ /**
low-level latency setting support
Sets the size of the DirectSound host buffer.
When flags contains the paWinDirectSoundUseLowLevelLatencyParameters
- this size will be used instead of interpreting the generic latency
+ this size will be used instead of interpreting the generic latency
parameters to Pa_OpenStream(). If the flag is not set this value is ignored.
If the stream is a full duplex stream the implementation requires that
@@ -77,7 +77,7 @@ typedef struct PaWinDirectSoundStreamInfo{
/**
support for WAVEFORMATEXTENSIBLE channel masks. If flags contains
- paWinDirectSoundUseChannelMask this allows you to specify which speakers
+ paWinDirectSoundUseChannelMask this allows you to specify which speakers
to address in a multichannel stream. Constants for channelMask
are specified in pa_win_waveformat.h
@@ -92,4 +92,4 @@ typedef struct PaWinDirectSoundStreamInfo{
}
#endif /* __cplusplus */
-#endif /* PA_WIN_DS_H */
+#endif /* PA_WIN_DS_H */
diff --git a/3rdparty/portaudio/include/pa_win_wasapi.h b/3rdparty/portaudio/include/pa_win_wasapi.h
index 1d86896caef..ca75acb8b33 100644
--- a/3rdparty/portaudio/include/pa_win_wasapi.h
+++ b/3rdparty/portaudio/include/pa_win_wasapi.h
@@ -3,9 +3,11 @@
/*
* $Id: $
* PortAudio Portable Real-Time Audio Library
- * DirectSound specific extensions
+ * WASAPI specific extensions
*
- * Copyright (c) 1999-2007 Ross Bencina and Phil Burk
+ * Copyright (c) 1999-2018 Ross Bencina and Phil Burk
+ * Copyright (c) 2006-2010 David Viens
+ * Copyright (c) 2010-2022 Dmitry Kostjuchenko
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files
@@ -28,13 +30,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
@@ -52,26 +54,40 @@ extern "C"
#endif /* __cplusplus */
-/* Setup flags */
+/* Stream setup flags. */
typedef enum PaWasapiFlags
{
- /* puts WASAPI into exclusive mode */
+ /* put WASAPI into exclusive mode */
paWinWasapiExclusive = (1 << 0),
- /* allows to skip internal PA processing completely */
+ /* allow to skip internal PA processing completely */
paWinWasapiRedirectHostProcessor = (1 << 1),
- /* assigns custom channel mask */
+ /* assign custom channel mask */
paWinWasapiUseChannelMask = (1 << 2),
- /* selects non-Event driven method of data read/write
- Note: WASAPI Event driven core is capable of 2ms latency!!!, but Polling
- method can only provide 15-20ms latency. */
+ /* use Polling method (Event method is the default, see details in the IMPORTANT notes) */
paWinWasapiPolling = (1 << 3),
- /* forces custom thread priority setting, must be used if PaWasapiStreamInfo::threadPriority
+ /* force custom thread priority setting, must be used if PaWasapiStreamInfo::threadPriority
is set to a custom value */
- paWinWasapiThreadPriority = (1 << 4)
+ paWinWasapiThreadPriority = (1 << 4),
+
+ /* force explicit sample format and do not allow PA to select suitable working format, API will
+ fail if provided sample format is not supported by audio hardware in Exclusive mode
+ or system mixer in Shared mode */
+ paWinWasapiExplicitSampleFormat = (1 << 5),
+
+ /* allow API to insert system-level channel matrix mixer and sample rate converter to allow
+ playback formats that do not match the current configured system settings.
+ this is in particular required for streams not matching the system mixer sample rate.
+ only applies in Shared mode. */
+ paWinWasapiAutoConvert = (1 << 6),
+
+ /* use Passthrough mode for sending encoded audio data in PCM containers to the audio device,
+ refer to Microsoft documentation "Representing Formats for IEC 61937 Transmissions" for more
+ details about data representation and stream configuration */
+ paWinWasapiPassthrough = (1 << 7),
}
PaWasapiFlags;
#define paWinWasapiExclusive (paWinWasapiExclusive)
@@ -79,17 +95,67 @@ PaWasapiFlags;
#define paWinWasapiUseChannelMask (paWinWasapiUseChannelMask)
#define paWinWasapiPolling (paWinWasapiPolling)
#define paWinWasapiThreadPriority (paWinWasapiThreadPriority)
+#define paWinWasapiExplicitSampleFormat (paWinWasapiExplicitSampleFormat)
+#define paWinWasapiAutoConvert (paWinWasapiAutoConvert)
+#define paWinWasapiPassthrough (paWinWasapiPassthrough)
-/* Host processor. Allows to skip internal PA processing completely.
- You must set paWinWasapiRedirectHostProcessor flag to PaWasapiStreamInfo::flags member
- in order to have host processor redirected to your callback.
+/* Stream state.
+
+ @note Multiple states can be united into a bitmask.
+ @see PaWasapiStreamStateCallback, PaWasapi_SetStreamStateHandler
+*/
+typedef enum PaWasapiStreamState
+{
+ /* state change was caused by the error:
+
+ Example:
+ 1) If thread execution stopped due to AUDCLNT_E_RESOURCES_INVALIDATED then state
+ value will contain paWasapiStreamStateError|paWasapiStreamStateThreadStop.
+ */
+ paWasapiStreamStateError = (1 << 0),
+
+ /* processing thread is preparing to start execution */
+ paWasapiStreamStateThreadPrepare = (1 << 1),
+
+ /* processing thread started execution (enters its loop) */
+ paWasapiStreamStateThreadStart = (1 << 2),
+
+ /* processing thread stopped execution */
+ paWasapiStreamStateThreadStop = (1 << 3)
+}
+PaWasapiStreamState;
+#define paWasapiStreamStateError (paWasapiStreamStateError)
+#define paWasapiStreamStateThreadPrepare (paWasapiStreamStateThreadPrepare)
+#define paWasapiStreamStateThreadStart (paWasapiStreamStateThreadStart)
+#define paWasapiStreamStateThreadStop (paWasapiStreamStateThreadStop)
+
+
+/* Host processor.
+
+ Allows to skip internal PA processing completely. paWinWasapiRedirectHostProcessor flag
+ must be set to the PaWasapiStreamInfo::flags member in order to have host processor
+ redirected to this callback.
+
Use with caution! inputFrames and outputFrames depend solely on final device setup.
- To query maximal values of inputFrames/outputFrames use PaWasapi_GetFramesPerHostBuffer.
+ To query max values of inputFrames/outputFrames use PaWasapi_GetFramesPerHostBuffer.
+*/
+typedef void (*PaWasapiHostProcessorCallback) (void *inputBuffer, long inputFrames,
+ void *outputBuffer, long outputFrames, void *userData);
+
+
+/* Stream state handler.
+
+ @param pStream Pointer to PaStream object.
+ @param stateFlags State flags, a collection of values from PaWasapiStreamState enum.
+ @param errorId Error id provided by system API (HRESULT).
+ @param userData Pointer to user data.
+
+ @see PaWasapiStreamState
*/
-typedef void (*PaWasapiHostProcessorCallback) (void *inputBuffer, long inputFrames,
- void *outputBuffer, long outputFrames,
- void *userData);
+typedef void (*PaWasapiStreamStateCallback) (PaStream *pStream, unsigned int stateFlags,
+ unsigned int errorId, void *pUserData);
+
/* Device role. */
typedef enum PaWasapiDeviceRole
@@ -124,7 +190,7 @@ typedef enum PaWasapiJackConnectionType
eJackConnTypeXlrProfessional,
eJackConnTypeRJ11Modem,
eJackConnTypeCombination
-}
+}
PaWasapiJackConnectionType;
@@ -147,7 +213,7 @@ typedef enum PaWasapiJackGeoLocation
eJackGeoLocATAPI,
eJackGeoLocReserved5,
eJackGeoLocReserved6,
-}
+}
PaWasapiJackGeoLocation;
@@ -158,7 +224,7 @@ typedef enum PaWasapiJackGenLocation
eJackGenLocInternal,
eJackGenLocSeparate,
eJackGenLocOther
-}
+}
PaWasapiJackGenLocation;
@@ -169,7 +235,7 @@ typedef enum PaWasapiJackPortConnection
eJackPortConnIntegratedDevice,
eJackPortConnBothIntegratedAndJack,
eJackPortConnUnknown
-}
+}
PaWasapiJackPortConnection;
@@ -177,7 +243,7 @@ PaWasapiJackPortConnection;
typedef enum PaWasapiThreadPriority
{
eThreadPriorityNone = 0,
- eThreadPriorityAudio, //!< Default for Shared mode.
+ eThreadPriorityAudio, //!< Default for Shared mode.
eThreadPriorityCapture,
eThreadPriorityDistribution,
eThreadPriorityGames,
@@ -189,7 +255,7 @@ PaWasapiThreadPriority;
/* Stream descriptor. */
-typedef struct PaWasapiJackDescription
+typedef struct PaWasapiJackDescription
{
unsigned long channelMapping;
unsigned long color; /* derived from macro: #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) */
@@ -205,7 +271,7 @@ PaWasapiJackDescription;
/** Stream category.
Note:
- values are equal to WASAPI AUDIO_STREAM_CATEGORY enum
- - supported since Windows 8.0, noop on earler versions
+ - supported since Windows 8.0, noop on earlier versions
- values 1,2 are deprecated on Windows 10 and not included into enumeration
@version Available as of 19.6.0
@@ -229,7 +295,7 @@ PaWasapiStreamCategory;
/** Stream option.
Note:
- values are equal to WASAPI AUDCLNT_STREAMOPTIONS enum
- - supported since Windows 8.1, noop on earler versions
+ - supported since Windows 8.1, noop on earlier versions
@version Available as of 19.6.0
*/
@@ -242,8 +308,63 @@ typedef enum PaWasapiStreamOption
PaWasapiStreamOption;
+/** Passthrough format.
+
+ Format ids are obtained from the Microsoft documentation "Representing Formats for IEC 61937 Transmissions"
+ and are composed by such formula where GUID is the guid of passthrough format:
+ GUID.Data1 << 16 | GUID.Data2.
+
+ @see PaWasapiStreamPassthrough
+ @version Available as of 19.8.0
+*/
+typedef enum PaWasapiPassthroughFormat
+{
+ ePassthroughFormatPcmIec60958 = 0x00000000,
+ ePassthroughFormatDolbyDigital = 0x00920000,
+ ePassthroughFormatMpeg1 = 0x00030cea,
+ ePassthroughFormatMpeg3 = 0x00040cea,
+ ePassthroughFormatMpeg2 = 0x00050cea,
+ ePassthroughFormatAac = 0x00060cea,
+ ePassthroughFormatDts = 0x00080cea,
+ ePassthroughFormatDolbyDigitalPlus = 0x000a0cea,
+ ePassthroughFormatDolbyDigitalPlusAtmos = 0x010a0cea,
+ ePassthroughFormatDtsHd = 0x000b0cea,
+ ePassthroughFormatDtsXE1 = 0x010b0cea,
+ ePassthroughFormatDtsXE2 = 0x030b0cea,
+ ePassthroughFormatDolbyMlp = 0x000c0cea,
+ ePassthroughFormatDolbyMat20 = 0x010c0cea,
+ ePassthroughFormatDolbyMat21 = 0x030c0cea,
+ ePassthroughFormatWmaPro = 0x01640000,
+ ePassthroughFormatAtrac = 0x00080cea,
+ ePassthroughFormatOneBitAudio = 0x00090cea,
+ ePassthroughFormatDst = 0x000d0cea,
+}
+PaWasapiPassthroughFormat;
+
+
+/** Passthrough details.
+
+ Passthrough details provide direct link to the additional members in WAVEFORMATEXTENSIBLE_IEC61937.
+ Passthrough mode allows to pass encoded data inside the PCM containers to the audio device.
+
+ Detailed description about supported formats and examples are provided in Microsoft documentation
+ "Representing Formats for IEC 61937 Transmissions".
+
+ @see paWinWasapiPassthrough
+ @version Available as of 19.8.0
+*/
+typedef struct PaWasapiStreamPassthrough
+{
+ PaWasapiPassthroughFormat formatId;
+ unsigned int encodedSamplesPerSec;
+ unsigned int encodedChannelCount;
+ unsigned int averageBytesPerSec;
+}
+PaWasapiStreamPassthrough;
+
+
/* Stream descriptor. */
-typedef struct PaWasapiStreamInfo
+typedef struct PaWasapiStreamInfo
{
unsigned long size; /**< sizeof(PaWasapiStreamInfo) */
PaHostApiTypeId hostApiType; /**< paWASAPI */
@@ -252,16 +373,16 @@ typedef struct PaWasapiStreamInfo
unsigned long flags; /**< collection of PaWasapiFlags */
/** Support for WAVEFORMATEXTENSIBLE channel masks. If flags contains
- paWinWasapiUseChannelMask this allows you to specify which speakers
+ paWinWasapiUseChannelMask this allows you to specify which speakers
to address in a multichannel stream. Constants for channelMask
- are specified in pa_win_waveformat.h. Will be used only if
+ are specified in pa_win_waveformat.h. Will be used only if
paWinWasapiUseChannelMask flag is specified.
*/
PaWinWaveFormatChannelMask channelMask;
/** Delivers raw data to callback obtained from GetBuffer() methods skipping
- internal PortAudio processing inventory completely. userData parameter will
- be the same that was passed to Pa_OpenStream method. Will be used only if
+ internal PortAudio processing inventory completely. userData parameter will
+ be the same that was passed to Pa_OpenStream method. Will be used only if
paWinWasapiRedirectHostProcessor flag is specified.
*/
PaWasapiHostProcessorCallback hostProcessorOutput;
@@ -270,7 +391,7 @@ typedef struct PaWasapiStreamInfo
/** Specifies thread priority explicitly. Will be used only if paWinWasapiThreadPriority flag
is specified.
- Please note, if Input/Output streams are opened simultaniously (Full-Duplex mode)
+ Please note, if Input/Output streams are opened simultaneously (Full-Duplex mode)
you shall specify same value for threadPriority or othervise one of the values will be used
to setup thread priority.
*/
@@ -287,103 +408,289 @@ typedef struct PaWasapiStreamInfo
@version Available as of 19.6.0
*/
PaWasapiStreamOption streamOption;
-}
+
+ /** Passthrough details.
+ @note paWinWasapiPassthrough flag must be specified in PaWasapiStreamInfo::flags to enable Passthrough mode.
+ @see paWinWasapiPassthrough
+ @version Available as of 19.7.0
+ */
+ PaWasapiStreamPassthrough passthrough;
+}
PaWasapiStreamInfo;
-/** Returns default sound format for device. Format is represented by PaWinWaveFormat or
- WAVEFORMATEXTENSIBLE structure.
+/** Returns pointer to WASAPI's IAudioClient object of the stream.
+
+ @param pStream Pointer to PaStream object.
+ @param pAudioClient Pointer to pointer of IAudioClient.
+ @param bOutput TRUE (1) for output stream, FALSE (0) for input stream.
+
+ @return Error code indicating success or failure.
+*/
+PaError PaWasapi_GetAudioClient( PaStream *pStream, void **pAudioClient, int bOutput );
+
+
+/** Update device list.
+
+ This function is available if PA_WASAPI_MAX_CONST_DEVICE_COUNT is defined during compile time
+ with maximum constant WASAPI device count (recommended value - 32).
+ If PA_WASAPI_MAX_CONST_DEVICE_COUNT is set to 0 (or not defined) during compile time the implementation
+ will not define PaWasapi_UpdateDeviceList() and thus updating device list can only be possible by calling
+ Pa_Terminate() and then Pa_Initialize().
+
+ @return Error code indicating success or failure.
+*/
+PaError PaWasapi_UpdateDeviceList();
+
+
+/** Get current audio format of the device assigned to the opened stream.
+
+ Format is represented by PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure.
+ Use this function to reconfirm format if PA's processor is overridden and
+ paWinWasapiRedirectHostProcessor flag is specified.
- @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure.
- @param nFormatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes.
- @param nDevice Device index.
+ @param pStream Pointer to PaStream object.
+ @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure.
+ @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes.
+ @param bOutput TRUE (1) for output stream, FALSE (0) for input stream.
- @return Non-negative value indicating the number of bytes copied into format decriptor
- or, a PaErrorCode (which are always negative) if PortAudio is not initialized
+ @return Non-negative value indicating the number of bytes copied into format descriptor
+ or, a PaErrorCode (which is always negative) if PortAudio is not initialized
or an error is encountered.
*/
-int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, PaDeviceIndex nDevice );
+int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned int formatSize, int bOutput );
+
+
+/** Get default audio format for the device in Shared Mode.
+
+ Format is represented by PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure and obtained
+ by getting the device property with a PKEY_AudioEngine_DeviceFormat key.
+
+ @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure.
+ @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes.
+ @param device Device index.
+
+ @return Non-negative value indicating the number of bytes copied into format descriptor
+ or, a PaErrorCode (which is always negative) if PortAudio is not initialized
+ or an error is encountered.
+*/
+int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device );
+
+
+/** Get mix audio format for the device in Shared Mode.
+
+ Format is represented by PaWinWaveFormat or WAVEFORMATEXTENSIBLE structureand obtained by
+ IAudioClient::GetMixFormat.
+
+ @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure.
+ @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes.
+ @param device Device index.
+
+ @return Non-negative value indicating the number of bytes copied into format descriptor
+ or, a PaErrorCode (which is always negative) if PortAudio is not initialized
+ or an error is encountered.
+*/
+int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device );
+
+
+/** Get device role (PaWasapiDeviceRole enum).
+
+ @param device Device index.
+
+ @return Non-negative value indicating device role or, a PaErrorCode (which is always negative)
+ if PortAudio is not initialized or an error is encountered.
+*/
+int/*PaWasapiDeviceRole*/ PaWasapi_GetDeviceRole( PaDeviceIndex device );
+
+
+/** Get device IMMDevice pointer.
+
+ @param device Device index.
+ @param pAudioClient Pointer to pointer of IMMDevice.
+
+ @return Error code indicating success or failure.
+*/
+PaError PaWasapi_GetIMMDevice( PaDeviceIndex device, void **pIMMDevice );
+
+/** Get device loopback state:
-/** Returns device role (PaWasapiDeviceRole enum).
+ 0 - Not loopback,
+ 1 - Loopback,
+ negative - PaErrorCode.
- @param nDevice device index.
+ @param device Device index.
- @return Non-negative value indicating device role or, a PaErrorCode (which are always negative)
+ @return Non-negative value indicating loopback state or, a PaErrorCode (which is always negative)
if PortAudio is not initialized or an error is encountered.
*/
-int/*PaWasapiDeviceRole*/ PaWasapi_GetDeviceRole( PaDeviceIndex nDevice );
+int PaWasapi_IsLoopback( PaDeviceIndex device );
-/** Boost thread priority of calling thread (MMCSS). Use it for Blocking Interface only for thread
- which makes calls to Pa_WriteStream/Pa_ReadStream.
+/** Boost thread priority of calling thread (MMCSS).
- @param hTask Handle to pointer to priority task. Must be used with PaWasapi_RevertThreadPriority
- method to revert thread priority to initial state.
+ Use it for Blocking Interface only inside the thread which makes calls to Pa_WriteStream/Pa_ReadStream.
- @param nPriorityClass Id of thread priority of PaWasapiThreadPriority type. Specifying
- eThreadPriorityNone does nothing.
+ @param pTask Handle to pointer to priority task. Must be used with PaWasapi_RevertThreadPriority
+ method to revert thread priority to initial state.
+
+ @param priorityClass Id of thread priority of PaWasapiThreadPriority type. Specifying
+ eThreadPriorityNone does nothing.
@return Error code indicating success or failure.
@see PaWasapi_RevertThreadPriority
*/
-PaError PaWasapi_ThreadPriorityBoost( void **hTask, PaWasapiThreadPriority nPriorityClass );
+PaError PaWasapi_ThreadPriorityBoost( void **pTask, PaWasapiThreadPriority priorityClass );
+
+
+/** Boost thread priority of calling thread (MMCSS).
+ Use it for Blocking Interface only inside the thread which makes calls to Pa_WriteStream/Pa_ReadStream.
-/** Boost thread priority of calling thread (MMCSS). Use it for Blocking Interface only for thread
- which makes calls to Pa_WriteStream/Pa_ReadStream.
+ @param pTask Task handle obtained by PaWasapi_BoostThreadPriority method.
- @param hTask Task handle obtained by PaWasapi_BoostThreadPriority method.
@return Error code indicating success or failure.
@see PaWasapi_BoostThreadPriority
*/
-PaError PaWasapi_ThreadPriorityRevert( void *hTask );
+PaError PaWasapi_ThreadPriorityRevert( void *pTask );
+
+
+/** Get number of frames per host buffer.
+ It is max value of frames of WASAPI buffer which can be locked for operations.
+ Use this method as helper to find out max values of inputFrames/outputFrames
+ of PaWasapiHostProcessorCallback.
-/** Get number of frames per host buffer. This is maximal value of frames of WASAPI buffer which
- can be locked for operations. Use this method as helper to findout maximal values of
- inputFrames/outputFrames of PaWasapiHostProcessorCallback.
+ @param pStream Pointer to PaStream object.
+ @param pInput Pointer to variable to receive number of input frames. Can be NULL.
+ @param pOutput Pointer to variable to receive number of output frames. Can be NULL.
- @param pStream Pointer to PaStream to query.
- @param nInput Pointer to variable to receive number of input frames. Can be NULL.
- @param nOutput Pointer to variable to receive number of output frames. Can be NULL.
@return Error code indicating success or failure.
@see PaWasapiHostProcessorCallback
*/
-PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *nInput, unsigned int *nOutput );
+PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *pInput, unsigned int *pOutput );
+
+
+/** Get number of jacks associated with a WASAPI device.
+
+ Use this method to determine if there are any jacks associated with the provided WASAPI device.
+ Not all audio devices will support this capability. This is valid for both input and output devices.
+
+ @note Not available on UWP platform.
+ @param device Device index.
+ @param pJackCount Pointer to variable to receive number of jacks.
-/** Get number of jacks associated with a WASAPI device. Use this method to determine if
- there are any jacks associated with the provided WASAPI device. Not all audio devices
- will support this capability. This is valid for both input and output devices.
- @param nDevice device index.
- @param jcount Number of jacks is returned in this variable
- @return Error code indicating success or failure
- @see PaWasapi_GetJackDescription
+ @return Error code indicating success or failure.
+ @see PaWasapi_GetJackDescription
*/
-PaError PaWasapi_GetJackCount(PaDeviceIndex nDevice, int *jcount);
+PaError PaWasapi_GetJackCount( PaDeviceIndex device, int *pJackCount );
+
+/** Get the jack description associated with a WASAPI device and jack number.
-/** Get the jack description associated with a WASAPI device and jack number
Before this function is called, use PaWasapi_GetJackCount to determine the
number of jacks associated with device. If jcount is greater than zero, then
each jack from 0 to jcount can be queried with this function to get the jack
description.
- @param nDevice device index.
- @param jindex Which jack to return information
- @param KSJACK_DESCRIPTION This structure filled in on success.
- @return Error code indicating success or failure
+
+ @note Not available on UWP platform.
+
+ @param device Device index.
+ @param jackIndex Jack index.
+ @param pJackDescription Pointer to PaWasapiJackDescription.
+
+ @return Error code indicating success or failure.
@see PaWasapi_GetJackCount
*/
-PaError PaWasapi_GetJackDescription(PaDeviceIndex nDevice, int jindex, PaWasapiJackDescription *pJackDescription);
+PaError PaWasapi_GetJackDescription( PaDeviceIndex device, int jackIndex, PaWasapiJackDescription *pJackDescription );
+
+
+/** Set stream state handler.
+
+ @param pStream Pointer to PaStream object.
+ @param fnStateHandler Pointer to state handling function.
+ @param pUserData Pointer to user data.
+
+ @return Error code indicating success or failure.
+*/
+PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCallback fnStateHandler, void *pUserData );
+
+
+/** Set default device Id.
+
+ By default implementation will use the DEVINTERFACE_AUDIO_RENDER and
+ DEVINTERFACE_AUDIO_CAPTURE Ids if device Id is not provided explicitly. These default Ids
+ will not allow to use Exclusive mode on UWP/WinRT platform and thus you must provide
+ device Id explicitly via this API before calling the Pa_OpenStream().
+
+ Device Ids on UWP platform are obtainable via:
+ Windows::Media::Devices::MediaDevice::GetDefaultAudioRenderId() or
+ Windows::Media::Devices::MediaDevice::GetDefaultAudioCaptureId() API.
+
+ After the call completes, memory referenced by pointers can be freed, as implementation keeps its own copy.
+
+ Call this function before calling Pa_IsFormatSupported() when Exclusive mode is requested.
+
+ See an example in the IMPORTANT notes.
+
+ @note UWP/WinRT platform only.
+
+ @param pId Device Id, pointer to the 16-bit Unicode string (WCHAR). If NULL then device Id
+ will be reset to the default, e.g. DEVINTERFACE_AUDIO_RENDER or DEVINTERFACE_AUDIO_CAPTURE.
+ @param bOutput TRUE (1) for output (render), FALSE (0) for input (capture).
+
+ @return Error code indicating success or failure. Will return paIncompatibleStreamHostApi if library is not compiled
+ for UWP/WinRT platform. If Id is longer than PA_WASAPI_DEVICE_ID_LEN characters paBufferTooBig will
+ be returned.
+*/
+PaError PaWasapiWinrt_SetDefaultDeviceId( const unsigned short *pId, int bOutput );
+
+
+/** Populate the device list.
+
+ By default the implementation will rely on DEVINTERFACE_AUDIO_RENDER and DEVINTERFACE_AUDIO_CAPTURE as
+ default devices. If device Id is provided by PaWasapiWinrt_SetDefaultDeviceId() then those
+ device Ids will be used as default and only devices for the device list.
+
+ By populating the device list you can provide an additional available audio devices of the system to PA
+ which are obtainable by:
+ Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(selector) where selector is obtainable by
+ Windows::Media::Devices::MediaDevice::GetAudioRenderSelector() or
+ Windows::Media::Devices::MediaDevice::GetAudioCaptureSelector() API.
+
+ After the call completes, memory referenced by pointers can be freed, as implementation keeps its own copy.
+
+ You must call PaWasapi_UpdateDeviceList() to update the internal device list of the implementation after
+ calling this function.
+
+ See an example in the IMPORTANT notes.
+
+ @note UWP/WinRT platform only.
+
+ @param pId Array of device Ids, pointer to the array of pointers of 16-bit Unicode string (WCHAR). If NULL
+ and count is also 0 then device Ids will be reset to the default. Required.
+ @param pName Array of device Names, pointer to the array of pointers of 16-bit Unicode string (WCHAR). Optional.
+ @param pRole Array of device Roles, see PaWasapiDeviceRole and PaWasapi_GetDeviceRole() for more details. Optional.
+ @param count Number of devices, the number of array elements (pId, pName, pRole). Maximum count of devices
+ is limited by PA_WASAPI_DEVICE_MAX_COUNT.
+ @param bOutput TRUE (1) for output (render), FALSE (0) for input (capture).
+
+ @return Error code indicating success or failure. Will return paIncompatibleStreamHostApi if library is not compiled
+ for UWP/WinRT platform. If Id is longer than PA_WASAPI_DEVICE_ID_LEN characters paBufferTooBig will
+ be returned. If Name is longer than PA_WASAPI_DEVICE_NAME_LEN characters paBufferTooBig will
+ be returned.
+*/
+PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsigned short **pName,
+ const PaWasapiDeviceRole *pRole, unsigned int count, int bOutput );
/*
IMPORTANT:
WASAPI is implemented for Callback and Blocking interfaces. It supports Shared and Exclusive
- share modes.
-
+ share modes.
+
Exclusive Mode:
Exclusive mode allows to deliver audio data directly to hardware bypassing
@@ -392,52 +699,116 @@ PaError PaWasapi_GetJackDescription(PaDeviceIndex nDevice, int jindex, PaWasapiJ
Callback Interface:
- Provides best audio quality with low latency. Callback interface is implemented in
+ Provides best audio quality with low latency. Callback interface is implemented in
two versions:
- 1) Event-Driven:
- This is the most powerful WASAPI implementation which provides glitch-free
- audio at around 3ms latency in Exclusive mode. Lowest possible latency for this mode is
- 3 ms for HD Audio class audio chips. For the Shared mode latency can not be
- lower than 20 ms.
-
- 2) Poll-Driven:
- Polling is another 2-nd method to operate with WASAPI. It is less efficient than Event-Driven
- and provides latency at around 10-13ms. Polling must be used to overcome a system bug
- under Windows Vista x64 when application is WOW64(32-bit) and Event-Driven method simply
- times out (event handle is never signalled on buffer completion). Please note, such WOW64 bug
- does not exist in Vista x86 or Windows 7.
- Polling can be setup by speciying 'paWinWasapiPolling' flag. Our WASAPI implementation detects
- WOW64 bug and sets 'paWinWasapiPolling' automatically.
+ 1) Event-driven:
+ It is the most powerful data processing method which provides glitch-free audio with
+ around 3 ms latency in Exclusive mode. Lowest possible latency for this mode is
+ 3 ms for HD Audio class audio chips. For the Shared mode latency can not be
+ lower than 20 ms. This method consumes slightly less CPU in comparison to Polling.
+ It is the default processing method unless 'paWinWasapiPolling' is specified.
+
+ 2) Poll-driven:
+ Polling is an alternative to Event-driven processing. Due to its nature Polling consumes
+ slightly more CPU. This method is less efficient than Event-driven and its lowest possible
+ latency is around 10-13 ms.
+ Note: Newer Windows versions (for example 11) allow to achieve similar to Event-driven
+ low latency.
+ Note: Polling must be used to overcome system bug of Windows Vista (x64) when application
+ is WOW64 (32-bit process running on 64-bit OS) that results in WASAPI callback timeout if
+ Event-driven method is selected (event handle is never signalled on buffer completion).
+ This WOW64 bug does not exist in Windows Vista (x86) or Windows 7 or newer Windows versions.
+ Polling can be activated by specifying 'paWinWasapiPolling' flag. Our implementation
+ detects WOW64 bug and sets 'paWinWasapiPolling' automatically.
Thread priority:
Normally thread priority is set automatically and does not require modification. Although
if user wants some tweaking thread priority can be modified by setting 'paWinWasapiThreadPriority'
- flag and specifying 'PaWasapiStreamInfo::threadPriority' with value from PaWasapiThreadPriority
+ flag and specifying 'PaWasapiStreamInfo::threadPriority' with value from PaWasapiThreadPriority
enum.
Blocking Interface:
Blocking interface is implemented but due to above described Poll-Driven method can not
- deliver lowest possible latency. Specifying too low latency in Shared mode will result in
+ deliver lowest possible latency. Specifying too low latency in Shared mode will result in
distorted audio although Exclusive mode adds stability.
+ 8.24 format:
+
+ If paCustomFormat is specified as sample format then the implementation will understand it
+ as valid 24-bits inside 32-bit container (e.g. wBitsPerSample = 32, Samples.wValidBitsPerSample = 24).
+
+ By using paCustomFormat there will be small optimization when samples are be copied
+ with Copy_24_To_24 by PA processor instead of conversion from packed 3-byte (24-bit) data
+ with Int24_To_Int32.
+
Pa_IsFormatSupported:
- To check format with correct Share Mode (Exclusive/Shared) you must supply
- PaWasapiStreamInfo with flags paWinWasapiExclusive set through member of
- PaStreamParameters::hostApiSpecificStreamInfo structure.
+ To check format with correct Share Mode (Exclusive/Shared) you must supply PaWasapiStreamInfo
+ with flags paWinWasapiExclusive set through member of PaStreamParameters::hostApiSpecificStreamInfo
+ structure.
+
+ If paWinWasapiExplicitSampleFormat flag is provided then implementation will not try to select
+ suitable close format and will return an error instead of paFormatIsSupported. By specifying
+ paWinWasapiExplicitSampleFormat flag it is possible to find out what sample formats are
+ supported by Exclusive or Shared modes.
Pa_OpenStream:
To set desired Share Mode (Exclusive/Shared) you must supply
- PaWasapiStreamInfo with flags paWinWasapiExclusive set through member of
+ PaWasapiStreamInfo with flags paWinWasapiExclusive set through member of
PaStreamParameters::hostApiSpecificStreamInfo structure.
+
+ Coding style for parameters and structure members of the public API:
+
+ 1) bXXX - boolean, [1 (TRUE), 0 (FALSE)]
+ 2) pXXX - pointer
+ 3) fnXXX - pointer to function
+ 4) structure members are never prefixed with a type distinguisher
+
+
+ UWP/WinRT:
+
+ This platform has number of limitations which do not allow to enumerate audio devices without
+ an additional external help. Enumeration is possible though from C++/CX, check the related API
+ Windows::Devices::Enumeration::DeviceInformation::FindAllAsync().
+
+ The main limitation is an absence of the device enumeration from inside the PA's implementation.
+ This problem can be solved by using the following functions:
+
+ PaWasapiWinrt_SetDefaultDeviceId() - to set default input/output device,
+ PaWasapiWinrt_PopulateDeviceList() - to populate device list with devices.
+
+ Here is an example of populating the device list which can also be updated dynamically depending on
+ whether device was removed from or added to the system:
+
+ ----------------
+
+ std::vector<const UINT16 *> ids, names;
+ std::vector<PaWasapiDeviceRole> role;
+
+ ids.resize(count);
+ names.resize(count);
+ role.resize(count);
+
+ for (UINT32 i = 0; i < count; ++i)
+ {
+ ids[i] = (const UINT16 *)device_ids[i].c_str();
+ names[i] = (const UINT16 *)device_names[i].c_str();
+ role[i] = eRoleUnknownFormFactor;
+ }
+
+ PaWasapiWinrt_SetDefaultDeviceId((const UINT16 *)default_device_id.c_str(), !capture);
+ PaWasapiWinrt_PopulateDeviceList(ids.data(), names.data(), role.data(), count, !capture);
+ PaWasapi_UpdateDeviceList();
+
+ ----------------
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
-#endif /* PA_WIN_WASAPI_H */
+#endif /* PA_WIN_WASAPI_H */
diff --git a/3rdparty/portaudio/include/pa_win_waveformat.h b/3rdparty/portaudio/include/pa_win_waveformat.h
index 2c00267117d..251562d0fb6 100644
--- a/3rdparty/portaudio/include/pa_win_waveformat.h
+++ b/3rdparty/portaudio/include/pa_win_waveformat.h
@@ -29,13 +29,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
@@ -49,87 +49,87 @@ extern "C" {
#endif
/*
- The following #defines for speaker channel masks are the same
- as those in ksmedia.h, except with PAWIN_ prepended, KSAUDIO_ removed
- in some cases, and casts to PaWinWaveFormatChannelMask added.
+ The following #defines for speaker channel masks are the same
+ as those in ksmedia.h, except with PAWIN_ prepended, KSAUDIO_ removed
+ in some cases, and casts to PaWinWaveFormatChannelMask added.
*/
typedef unsigned long PaWinWaveFormatChannelMask;
/* Speaker Positions: */
-#define PAWIN_SPEAKER_FRONT_LEFT ((PaWinWaveFormatChannelMask)0x1)
-#define PAWIN_SPEAKER_FRONT_RIGHT ((PaWinWaveFormatChannelMask)0x2)
-#define PAWIN_SPEAKER_FRONT_CENTER ((PaWinWaveFormatChannelMask)0x4)
-#define PAWIN_SPEAKER_LOW_FREQUENCY ((PaWinWaveFormatChannelMask)0x8)
-#define PAWIN_SPEAKER_BACK_LEFT ((PaWinWaveFormatChannelMask)0x10)
-#define PAWIN_SPEAKER_BACK_RIGHT ((PaWinWaveFormatChannelMask)0x20)
-#define PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER ((PaWinWaveFormatChannelMask)0x40)
-#define PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER ((PaWinWaveFormatChannelMask)0x80)
-#define PAWIN_SPEAKER_BACK_CENTER ((PaWinWaveFormatChannelMask)0x100)
-#define PAWIN_SPEAKER_SIDE_LEFT ((PaWinWaveFormatChannelMask)0x200)
-#define PAWIN_SPEAKER_SIDE_RIGHT ((PaWinWaveFormatChannelMask)0x400)
-#define PAWIN_SPEAKER_TOP_CENTER ((PaWinWaveFormatChannelMask)0x800)
-#define PAWIN_SPEAKER_TOP_FRONT_LEFT ((PaWinWaveFormatChannelMask)0x1000)
-#define PAWIN_SPEAKER_TOP_FRONT_CENTER ((PaWinWaveFormatChannelMask)0x2000)
-#define PAWIN_SPEAKER_TOP_FRONT_RIGHT ((PaWinWaveFormatChannelMask)0x4000)
-#define PAWIN_SPEAKER_TOP_BACK_LEFT ((PaWinWaveFormatChannelMask)0x8000)
-#define PAWIN_SPEAKER_TOP_BACK_CENTER ((PaWinWaveFormatChannelMask)0x10000)
-#define PAWIN_SPEAKER_TOP_BACK_RIGHT ((PaWinWaveFormatChannelMask)0x20000)
+#define PAWIN_SPEAKER_FRONT_LEFT ((PaWinWaveFormatChannelMask)0x1)
+#define PAWIN_SPEAKER_FRONT_RIGHT ((PaWinWaveFormatChannelMask)0x2)
+#define PAWIN_SPEAKER_FRONT_CENTER ((PaWinWaveFormatChannelMask)0x4)
+#define PAWIN_SPEAKER_LOW_FREQUENCY ((PaWinWaveFormatChannelMask)0x8)
+#define PAWIN_SPEAKER_BACK_LEFT ((PaWinWaveFormatChannelMask)0x10)
+#define PAWIN_SPEAKER_BACK_RIGHT ((PaWinWaveFormatChannelMask)0x20)
+#define PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER ((PaWinWaveFormatChannelMask)0x40)
+#define PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER ((PaWinWaveFormatChannelMask)0x80)
+#define PAWIN_SPEAKER_BACK_CENTER ((PaWinWaveFormatChannelMask)0x100)
+#define PAWIN_SPEAKER_SIDE_LEFT ((PaWinWaveFormatChannelMask)0x200)
+#define PAWIN_SPEAKER_SIDE_RIGHT ((PaWinWaveFormatChannelMask)0x400)
+#define PAWIN_SPEAKER_TOP_CENTER ((PaWinWaveFormatChannelMask)0x800)
+#define PAWIN_SPEAKER_TOP_FRONT_LEFT ((PaWinWaveFormatChannelMask)0x1000)
+#define PAWIN_SPEAKER_TOP_FRONT_CENTER ((PaWinWaveFormatChannelMask)0x2000)
+#define PAWIN_SPEAKER_TOP_FRONT_RIGHT ((PaWinWaveFormatChannelMask)0x4000)
+#define PAWIN_SPEAKER_TOP_BACK_LEFT ((PaWinWaveFormatChannelMask)0x8000)
+#define PAWIN_SPEAKER_TOP_BACK_CENTER ((PaWinWaveFormatChannelMask)0x10000)
+#define PAWIN_SPEAKER_TOP_BACK_RIGHT ((PaWinWaveFormatChannelMask)0x20000)
/* Bit mask locations reserved for future use */
-#define PAWIN_SPEAKER_RESERVED ((PaWinWaveFormatChannelMask)0x7FFC0000)
+#define PAWIN_SPEAKER_RESERVED ((PaWinWaveFormatChannelMask)0x7FFC0000)
/* Used to specify that any possible permutation of speaker configurations */
-#define PAWIN_SPEAKER_ALL ((PaWinWaveFormatChannelMask)0x80000000)
+#define PAWIN_SPEAKER_ALL ((PaWinWaveFormatChannelMask)0x80000000)
/* DirectSound Speaker Config */
-#define PAWIN_SPEAKER_DIRECTOUT 0
-#define PAWIN_SPEAKER_MONO (PAWIN_SPEAKER_FRONT_CENTER)
-#define PAWIN_SPEAKER_STEREO (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT)
-#define PAWIN_SPEAKER_QUAD (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
- PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT)
-#define PAWIN_SPEAKER_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
- PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_BACK_CENTER)
-#define PAWIN_SPEAKER_5POINT1 (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
- PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \
- PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT)
-#define PAWIN_SPEAKER_7POINT1 (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
- PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \
- PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT | \
- PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER | PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER)
-#define PAWIN_SPEAKER_5POINT1_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
- PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \
- PAWIN_SPEAKER_SIDE_LEFT | PAWIN_SPEAKER_SIDE_RIGHT)
-#define PAWIN_SPEAKER_7POINT1_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
- PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \
- PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT | \
- PAWIN_SPEAKER_SIDE_LEFT | PAWIN_SPEAKER_SIDE_RIGHT)
+#define PAWIN_SPEAKER_DIRECTOUT 0
+#define PAWIN_SPEAKER_MONO (PAWIN_SPEAKER_FRONT_CENTER)
+#define PAWIN_SPEAKER_STEREO (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT)
+#define PAWIN_SPEAKER_QUAD (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
+ PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT)
+#define PAWIN_SPEAKER_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
+ PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_BACK_CENTER)
+#define PAWIN_SPEAKER_5POINT1 (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
+ PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \
+ PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT)
+#define PAWIN_SPEAKER_7POINT1 (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
+ PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \
+ PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT | \
+ PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER | PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER)
+#define PAWIN_SPEAKER_5POINT1_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
+ PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \
+ PAWIN_SPEAKER_SIDE_LEFT | PAWIN_SPEAKER_SIDE_RIGHT)
+#define PAWIN_SPEAKER_7POINT1_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \
+ PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \
+ PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT | \
+ PAWIN_SPEAKER_SIDE_LEFT | PAWIN_SPEAKER_SIDE_RIGHT)
/*
According to the Microsoft documentation:
The following are obsolete 5.1 and 7.1 settings (they lack side speakers). Note this means
that the default 5.1 and 7.1 settings (KSAUDIO_SPEAKER_5POINT1 and KSAUDIO_SPEAKER_7POINT1 are
similarly obsolete but are unchanged for compatibility reasons).
*/
-#define PAWIN_SPEAKER_5POINT1_BACK PAWIN_SPEAKER_5POINT1
-#define PAWIN_SPEAKER_7POINT1_WIDE PAWIN_SPEAKER_7POINT1
+#define PAWIN_SPEAKER_5POINT1_BACK PAWIN_SPEAKER_5POINT1
+#define PAWIN_SPEAKER_7POINT1_WIDE PAWIN_SPEAKER_7POINT1
/* DVD Speaker Positions */
-#define PAWIN_SPEAKER_GROUND_FRONT_LEFT PAWIN_SPEAKER_FRONT_LEFT
-#define PAWIN_SPEAKER_GROUND_FRONT_CENTER PAWIN_SPEAKER_FRONT_CENTER
-#define PAWIN_SPEAKER_GROUND_FRONT_RIGHT PAWIN_SPEAKER_FRONT_RIGHT
-#define PAWIN_SPEAKER_GROUND_REAR_LEFT PAWIN_SPEAKER_BACK_LEFT
-#define PAWIN_SPEAKER_GROUND_REAR_RIGHT PAWIN_SPEAKER_BACK_RIGHT
-#define PAWIN_SPEAKER_TOP_MIDDLE PAWIN_SPEAKER_TOP_CENTER
-#define PAWIN_SPEAKER_SUPER_WOOFER PAWIN_SPEAKER_LOW_FREQUENCY
+#define PAWIN_SPEAKER_GROUND_FRONT_LEFT PAWIN_SPEAKER_FRONT_LEFT
+#define PAWIN_SPEAKER_GROUND_FRONT_CENTER PAWIN_SPEAKER_FRONT_CENTER
+#define PAWIN_SPEAKER_GROUND_FRONT_RIGHT PAWIN_SPEAKER_FRONT_RIGHT
+#define PAWIN_SPEAKER_GROUND_REAR_LEFT PAWIN_SPEAKER_BACK_LEFT
+#define PAWIN_SPEAKER_GROUND_REAR_RIGHT PAWIN_SPEAKER_BACK_RIGHT
+#define PAWIN_SPEAKER_TOP_MIDDLE PAWIN_SPEAKER_TOP_CENTER
+#define PAWIN_SPEAKER_SUPER_WOOFER PAWIN_SPEAKER_LOW_FREQUENCY
/*
- PaWinWaveFormat is defined here to provide compatibility with
- compilation environments which don't have headers defining
- WAVEFORMATEXTENSIBLE (e.g. older versions of MSVC, Borland C++ etc.
+ PaWinWaveFormat is defined here to provide compatibility with
+ compilation environments which don't have headers defining
+ WAVEFORMATEXTENSIBLE (e.g. older versions of MSVC, Borland C++ etc.
- The fields for WAVEFORMATEX and WAVEFORMATEXTENSIBLE are declared as an
- unsigned char array here to avoid clients who include this file having
+ The fields for WAVEFORMATEX and WAVEFORMATEXTENSIBLE are declared as an
+ unsigned char array here to avoid clients who include this file having
a dependency on windows.h and mmsystem.h, and also to to avoid having
to write separate packing pragmas for each compiler.
*/
@@ -138,24 +138,24 @@ typedef unsigned long PaWinWaveFormatChannelMask;
typedef struct{
unsigned char fields[ PAWIN_SIZEOF_WAVEFORMATEXTENSIBLE ];
- unsigned long extraLongForAlignment; /* ensure that compiler aligns struct to DWORD */
+ unsigned long extraLongForAlignment; /* ensure that compiler aligns struct to DWORD */
} PaWinWaveFormat;
/*
WAVEFORMATEXTENSIBLE fields:
-
+
union {
- WORD wValidBitsPerSample;
- WORD wSamplesPerBlock;
- WORD wReserved;
+ WORD wValidBitsPerSample;
+ WORD wSamplesPerBlock;
+ WORD wReserved;
} Samples;
- DWORD dwChannelMask;
+ DWORD dwChannelMask;
GUID SubFormat;
*/
-#define PAWIN_INDEXOF_WVALIDBITSPERSAMPLE (PAWIN_SIZEOF_WAVEFORMATEX+0)
-#define PAWIN_INDEXOF_DWCHANNELMASK (PAWIN_SIZEOF_WAVEFORMATEX+2)
-#define PAWIN_INDEXOF_SUBFORMAT (PAWIN_SIZEOF_WAVEFORMATEX+6)
+#define PAWIN_INDEXOF_WVALIDBITSPERSAMPLE (PAWIN_SIZEOF_WAVEFORMATEX+0)
+#define PAWIN_INDEXOF_DWCHANNELMASK (PAWIN_SIZEOF_WAVEFORMATEX+2)
+#define PAWIN_INDEXOF_SUBFORMAT (PAWIN_SIZEOF_WAVEFORMATEX+6)
/*
@@ -163,10 +163,10 @@ typedef struct{
PaWin_InitializeWaveFormatExtensible functions below. These must match
the standard Windows WAVE_FORMAT_* values.
*/
-#define PAWIN_WAVE_FORMAT_PCM (1)
-#define PAWIN_WAVE_FORMAT_IEEE_FLOAT (3)
-#define PAWIN_WAVE_FORMAT_DOLBY_AC3_SPDIF (0x0092)
-#define PAWIN_WAVE_FORMAT_WMA_SPDIF (0x0164)
+#define PAWIN_WAVE_FORMAT_PCM (1)
+#define PAWIN_WAVE_FORMAT_IEEE_FLOAT (3)
+#define PAWIN_WAVE_FORMAT_DOLBY_AC3_SPDIF (0x0092)
+#define PAWIN_WAVE_FORMAT_WMA_SPDIF (0x0164)
/*
@@ -176,16 +176,16 @@ typedef struct{
int PaWin_SampleFormatToLinearWaveFormatTag( PaSampleFormat sampleFormat );
/*
- Use the following two functions to initialize the waveformat structure.
+ Use the following two functions to initialize the waveformat structure.
*/
-void PaWin_InitializeWaveFormatEx( PaWinWaveFormat *waveFormat,
- int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate );
+void PaWin_InitializeWaveFormatEx( PaWinWaveFormat *waveFormat,
+ int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate );
-void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat,
- int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate,
- PaWinWaveFormatChannelMask channelMask );
+void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat,
+ int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate,
+ PaWinWaveFormatChannelMask channelMask );
/* Map a channel count to a speaker channel mask */
@@ -196,4 +196,4 @@ PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels );
}
#endif /* __cplusplus */
-#endif /* PA_WIN_WAVEFORMAT_H */ \ No newline at end of file
+#endif /* PA_WIN_WAVEFORMAT_H */
diff --git a/3rdparty/portaudio/include/pa_win_wdmks.h b/3rdparty/portaudio/include/pa_win_wdmks.h
index 35929625e2c..bc2f6897c57 100644
--- a/3rdparty/portaudio/include/pa_win_wdmks.h
+++ b/3rdparty/portaudio/include/pa_win_wdmks.h
@@ -28,13 +28,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
@@ -134,4 +134,4 @@ extern "C"
}
#endif /* __cplusplus */
-#endif /* PA_WIN_DS_H */
+#endif /* PA_WIN_DS_H */
diff --git a/3rdparty/portaudio/include/pa_win_wmme.h b/3rdparty/portaudio/include/pa_win_wmme.h
index f84b68b892d..814022b1eac 100644
--- a/3rdparty/portaudio/include/pa_win_wmme.h
+++ b/3rdparty/portaudio/include/pa_win_wmme.h
@@ -28,13 +28,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
@@ -52,7 +52,7 @@ extern "C"
#endif /* __cplusplus */
-/* The following are flags which can be set in
+/* The following are flags which can be set in
PaWinMmeStreamInfo's flags field.
*/
@@ -100,7 +100,7 @@ typedef struct PaWinMmeStreamInfo{
Pa_OpenStream().
*/
unsigned long framesPerBuffer;
- unsigned long bufferCount; /* formerly numBuffers */
+ unsigned long bufferCount; /* formerly numBuffers */
/* multiple devices per direction support
If flags contains the PaWinMmeUseMultipleDevices flag,
@@ -109,7 +109,7 @@ typedef struct PaWinMmeStreamInfo{
If devices are specified here, the corresponding device parameter
to Pa_OpenStream() should be set to paUseHostApiSpecificDeviceSpecification,
otherwise an paInvalidDevice error will result.
- The total number of channels accross all specified devices
+ The total number of channels across all specified devices
must agree with the corresponding channelCount parameter to
Pa_OpenStream() otherwise a paInvalidChannelCount error will result.
*/
@@ -118,7 +118,7 @@ typedef struct PaWinMmeStreamInfo{
/*
support for WAVEFORMATEXTENSIBLE channel masks. If flags contains
- paWinMmeUseChannelMask this allows you to specify which speakers
+ paWinMmeUseChannelMask this allows you to specify which speakers
to address in a multichannel stream. Constants for channelMask
are specified in pa_win_waveformat.h
@@ -155,7 +155,7 @@ HWAVEIN PaWinMME_GetStreamInputHandle( PaStream* stream, int handleIndex );
/** Retrieve the number of wave out handles used by a PortAudio WinMME stream.
Returns zero if the stream is input only.
-
+
@return A non-negative value indicating the number of wave out handles
or, a PaErrorCode (which are always negative) if PortAudio is not initialized
or an error is encountered.
@@ -182,4 +182,4 @@ HWAVEOUT PaWinMME_GetStreamOutputHandle( PaStream* stream, int handleIndex );
}
#endif /* __cplusplus */
-#endif /* PA_WIN_WMME_H */
+#endif /* PA_WIN_WMME_H */
diff --git a/3rdparty/portaudio/include/portaudio.h b/3rdparty/portaudio/include/portaudio.h
index 8a94aafbbb8..ab1efeb5592 100644
--- a/3rdparty/portaudio/include/portaudio.h
+++ b/3rdparty/portaudio/include/portaudio.h
@@ -29,13 +29,13 @@
*/
/*
- * The text above constitutes the entire PortAudio license; however,
+ * 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
+ * they can be incorporated into the canonical version. It is also
+ * requested that these non-binding requests be included along with the
* license above.
*/
@@ -100,7 +100,7 @@ typedef struct PaVersionInfo {
/** Version as a string, for example "PortAudio V19.5.0-devel, revision 1952M" */
const char *versionText;
} PaVersionInfo;
-
+
/** Retrieve version information for the currently running PortAudio build.
@return A pointer to an immutable PaVersionInfo structure.
@@ -111,7 +111,7 @@ typedef struct PaVersionInfo {
@see PaVersionInfo, paMakeVersionNumber
@version Available as of 19.5.0.
*/
-const PaVersionInfo* Pa_GetVersionInfo();
+const PaVersionInfo* Pa_GetVersionInfo( void );
/** Error codes returned by PortAudio functions.
@@ -151,7 +151,8 @@ typedef enum PaErrorCode
paCanNotReadFromAnOutputOnlyStream,
paCanNotWriteToAnInputOnlyStream,
paIncompatibleStreamHostApi,
- paBadBufferPtr
+ paBadBufferPtr,
+ paCanNotInitializeRecursively
} PaErrorCode;
@@ -167,9 +168,9 @@ const char *Pa_GetErrorText( PaError errorCode );
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
+ 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
@@ -196,7 +197,7 @@ PaError Pa_Initialize( void );
@return paNoError if successful, otherwise an error code indicating the cause
of failure.
-
+
@see Pa_Initialize
*/
PaError Pa_Terminate( void );
@@ -287,7 +288,9 @@ typedef enum PaHostApiTypeId
paWDMKS=11,
paJACK=12,
paWASAPI=13,
- paAudioScienceHPI=14
+ paAudioScienceHPI=14,
+ paAudioIO=15,
+ paPulseAudio=16
} PaHostApiTypeId;
@@ -320,7 +323,7 @@ typedef struct PaHostApiInfo
if no default output device is available.
*/
PaDeviceIndex defaultOutputDevice;
-
+
} PaHostApiInfo;
@@ -349,7 +352,7 @@ const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi );
@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.
@@ -376,7 +379,7 @@ PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type );
A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter
is out of range.
-
+
@see PaHostApiInfo
*/
PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi,
@@ -449,12 +452,12 @@ PaDeviceIndex Pa_GetDefaultInputDevice( void );
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
+/** 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;
@@ -472,7 +475,7 @@ typedef double PaTime;
paUInt8 is an unsigned 8 bit format where 128 is considered "ground"
- The paNonInterleaved flag indicates that audio data is passed as an array
+ 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.
@@ -502,7 +505,7 @@ 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;
@@ -544,7 +547,7 @@ typedef struct PaStreamParameters
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
@@ -619,9 +622,9 @@ PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters,
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
+ 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
@@ -679,7 +682,7 @@ typedef unsigned long PaStreamFlags;
/** 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)
@@ -693,7 +696,7 @@ typedef unsigned long PaStreamFlags;
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{
@@ -764,41 +767,41 @@ typedef enum PaStreamCallbackResult
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
+ 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
+ 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
+ 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
+ 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
+ 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.
+ and the time the callback was invoked.
See PaStreamCallbackTimeInfo and Pa_GetStreamTime()
@param statusFlags Flags indicating whether input and/or output buffers
@@ -836,10 +839,10 @@ typedef int PaStreamCallback(
/** 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.
@@ -847,10 +850,13 @@ typedef int PaStreamCallback(
@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
-
+ sample rate for both input and output. Note that the actual sampleRate
+ may differ very slightly from the desired rate because of hardware limitations.
+ The exact rate can be queried using Pa_GetStreamInfo(). If nothing close
+ to the desired sampleRate is available then the open will fail and return an error.
+
@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
@@ -862,11 +868,11 @@ typedef int PaStreamCallback(
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,
@@ -879,7 +885,7 @@ typedef int PaStreamCallback(
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).
@@ -904,7 +910,7 @@ PaError Pa_OpenStream( PaStream** stream,
@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
@@ -913,13 +919,13 @@ PaError Pa_OpenStream( PaStream** 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.
+ If 0 the stream is opened as an input-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.
@@ -945,7 +951,7 @@ PaError Pa_OpenDefaultStream( PaStream** stream,
PaError Pa_CloseStream( PaStream *stream );
-/** Functions of type PaStreamFinishedCallback are implemented by PortAudio
+/** 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).
@@ -954,7 +960,7 @@ PaError Pa_CloseStream( PaStream *stream );
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
@@ -962,12 +968,12 @@ PaError Pa_CloseStream( PaStream *stream );
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
+/** 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
+ 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
@@ -980,7 +986,7 @@ typedef void PaStreamFinishedCallback( void *userData );
@see PaStreamFinishedCallback
*/
-PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback );
+PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback );
/** Commences audio processing.
@@ -1065,7 +1071,7 @@ typedef struct PaStreamInfo
parameter passed to Pa_OpenStream().
*/
double sampleRate;
-
+
} PaStreamInfo;
@@ -1087,15 +1093,15 @@ 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.
-
+ 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
+ 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
@@ -1110,7 +1116,7 @@ PaTime Pa_GetStreamTime( PaStream *stream );
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
@@ -1126,13 +1132,17 @@ double Pa_GetStreamCpuLoad( PaStream* stream );
the entire buffer has been filled - this may involve waiting for the operating
system to supply the data.
+ Reading from a stream that is stopped is not currently supported. In particular,
+ it is not possible to drain the read buffer by calling Pa_ReadStream after
+ calling Pa_StopStream.
+
@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
+ 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
@@ -1152,13 +1162,17 @@ PaError Pa_ReadStream( PaStream* stream,
entire buffer has been written - this may involve waiting for the operating
system to consume the data.
+ Writing to a stream that is stopped is not currently supported. In particular,
+ it is not possible to prefill the write buffer by calling Pa_WriteStream
+ prior to calling Pa_StartStream.
+
@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
+ 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
@@ -1178,6 +1192,9 @@ PaError Pa_WriteStream( PaStream* stream,
/** Retrieve the number of frames that can be read from the stream without
waiting.
+ When the stream is stopped the return value of Pa_GetStreamReadAvailable is not
+ defined.
+
@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
@@ -1189,6 +1206,9 @@ signed long Pa_GetStreamReadAvailable( PaStream* stream );
/** Retrieve the number of frames that can be written to the stream without
waiting.
+ When the stream is stopped the return value of Pa_GetStreamWriteAvailable is not
+ defined.
+
@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