summaryrefslogtreecommitdiff
path: root/portaudio/include/pa_win_wasapi.h
diff options
context:
space:
mode:
Diffstat (limited to 'portaudio/include/pa_win_wasapi.h')
-rw-r--r--portaudio/include/pa_win_wasapi.h729
1 files changed, 0 insertions, 729 deletions
diff --git a/portaudio/include/pa_win_wasapi.h b/portaudio/include/pa_win_wasapi.h
deleted file mode 100644
index c046afd..0000000
--- a/portaudio/include/pa_win_wasapi.h
+++ /dev/null
@@ -1,729 +0,0 @@
-#ifndef PA_WIN_WASAPI_H
-#define PA_WIN_WASAPI_H
-/*
- * $Id: $
- * PortAudio Portable Real-Time Audio Library
- * WASAPI specific extensions
- *
- * Copyright (c) 1999-2018 Ross Bencina and Phil Burk
- * Copyright (c) 2006-2010 David Viens
- * Copyright (c) 2010-2018 Dmitry Kostjuchenko
- *
- * 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 WASAPI-specific PortAudio API extension header file.
-*/
-
-#include "portaudio.h"
-#include "pa_win_waveformat.h"
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* __cplusplus */
-
-
-/* Stream setup flags. */
-typedef enum PaWasapiFlags
-{
- /* put WASAPI into exclusive mode */
- paWinWasapiExclusive = (1 << 0),
-
- /* allow to skip internal PA processing completely */
- paWinWasapiRedirectHostProcessor = (1 << 1),
-
- /* assign custom channel mask */
- paWinWasapiUseChannelMask = (1 << 2),
-
- /* select 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. */
- paWinWasapiPolling = (1 << 3),
-
- /* force custom thread priority setting, must be used if PaWasapiStreamInfo::threadPriority
- is set to a custom value */
- 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)
-}
-PaWasapiFlags;
-#define paWinWasapiExclusive (paWinWasapiExclusive)
-#define paWinWasapiRedirectHostProcessor (paWinWasapiRedirectHostProcessor)
-#define paWinWasapiUseChannelMask (paWinWasapiUseChannelMask)
-#define paWinWasapiPolling (paWinWasapiPolling)
-#define paWinWasapiThreadPriority (paWinWasapiThreadPriority)
-#define paWinWasapiExplicitSampleFormat (paWinWasapiExplicitSampleFormat)
-#define paWinWasapiAutoConvert (paWinWasapiAutoConvert)
-
-
-/* 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 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 (*PaWasapiStreamStateCallback) (PaStream *pStream, unsigned int stateFlags,
- unsigned int errorId, void *pUserData);
-
-
-/* Device role. */
-typedef enum PaWasapiDeviceRole
-{
- eRoleRemoteNetworkDevice = 0,
- eRoleSpeakers,
- eRoleLineLevel,
- eRoleHeadphones,
- eRoleMicrophone,
- eRoleHeadset,
- eRoleHandset,
- eRoleUnknownDigitalPassthrough,
- eRoleSPDIF,
- eRoleHDMI,
- eRoleUnknownFormFactor
-}
-PaWasapiDeviceRole;
-
-
-/* Jack connection type. */
-typedef enum PaWasapiJackConnectionType
-{
- eJackConnTypeUnknown,
- eJackConnType3Point5mm,
- eJackConnTypeQuarter,
- eJackConnTypeAtapiInternal,
- eJackConnTypeRCA,
- eJackConnTypeOptical,
- eJackConnTypeOtherDigital,
- eJackConnTypeOtherAnalog,
- eJackConnTypeMultichannelAnalogDIN,
- eJackConnTypeXlrProfessional,
- eJackConnTypeRJ11Modem,
- eJackConnTypeCombination
-}
-PaWasapiJackConnectionType;
-
-
-/* Jack geometric location. */
-typedef enum PaWasapiJackGeoLocation
-{
- eJackGeoLocUnk = 0,
- eJackGeoLocRear = 0x1, /* matches EPcxGeoLocation::eGeoLocRear */
- eJackGeoLocFront,
- eJackGeoLocLeft,
- eJackGeoLocRight,
- eJackGeoLocTop,
- eJackGeoLocBottom,
- eJackGeoLocRearPanel,
- eJackGeoLocRiser,
- eJackGeoLocInsideMobileLid,
- eJackGeoLocDrivebay,
- eJackGeoLocHDMI,
- eJackGeoLocOutsideMobileLid,
- eJackGeoLocATAPI,
- eJackGeoLocReserved5,
- eJackGeoLocReserved6,
-}
-PaWasapiJackGeoLocation;
-
-
-/* Jack general location. */
-typedef enum PaWasapiJackGenLocation
-{
- eJackGenLocPrimaryBox = 0,
- eJackGenLocInternal,
- eJackGenLocSeparate,
- eJackGenLocOther
-}
-PaWasapiJackGenLocation;
-
-
-/* Jack's type of port. */
-typedef enum PaWasapiJackPortConnection
-{
- eJackPortConnJack = 0,
- eJackPortConnIntegratedDevice,
- eJackPortConnBothIntegratedAndJack,
- eJackPortConnUnknown
-}
-PaWasapiJackPortConnection;
-
-
-/* Thread priority. */
-typedef enum PaWasapiThreadPriority
-{
- eThreadPriorityNone = 0,
- eThreadPriorityAudio, //!< Default for Shared mode.
- eThreadPriorityCapture,
- eThreadPriorityDistribution,
- eThreadPriorityGames,
- eThreadPriorityPlayback,
- eThreadPriorityProAudio, //!< Default for Exclusive mode.
- eThreadPriorityWindowManager
-}
-PaWasapiThreadPriority;
-
-
-/* Stream descriptor. */
-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))) */
- PaWasapiJackConnectionType connectionType;
- PaWasapiJackGeoLocation geoLocation;
- PaWasapiJackGenLocation genLocation;
- PaWasapiJackPortConnection portConnection;
- unsigned int isConnected;
-}
-PaWasapiJackDescription;
-
-
-/** Stream category.
- Note:
- - values are equal to WASAPI AUDIO_STREAM_CATEGORY enum
- - 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
-*/
-typedef enum PaWasapiStreamCategory
-{
- eAudioCategoryOther = 0,
- eAudioCategoryCommunications = 3,
- eAudioCategoryAlerts = 4,
- eAudioCategorySoundEffects = 5,
- eAudioCategoryGameEffects = 6,
- eAudioCategoryGameMedia = 7,
- eAudioCategoryGameChat = 8,
- eAudioCategorySpeech = 9,
- eAudioCategoryMovie = 10,
- eAudioCategoryMedia = 11
-}
-PaWasapiStreamCategory;
-
-
-/** Stream option.
- Note:
- - values are equal to WASAPI AUDCLNT_STREAMOPTIONS enum
- - supported since Windows 8.1, noop on earlier versions
-
- @version Available as of 19.6.0
-*/
-typedef enum PaWasapiStreamOption
-{
- eStreamOptionNone = 0, //!< default
- eStreamOptionRaw = 1, //!< bypass WASAPI Audio Engine DSP effects, supported since Windows 8.1
- eStreamOptionMatchFormat = 2 //!< force WASAPI Audio Engine into a stream format, supported since Windows 10
-}
-PaWasapiStreamOption;
-
-
-/* Stream descriptor. */
-typedef struct PaWasapiStreamInfo
-{
- unsigned long size; /**< sizeof(PaWasapiStreamInfo) */
- PaHostApiTypeId hostApiType; /**< paWASAPI */
- unsigned long version; /**< 1 */
-
- unsigned long flags; /**< collection of PaWasapiFlags */
-
- /** Support for WAVEFORMATEXTENSIBLE channel masks. If flags contains
- 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
- 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
- paWinWasapiRedirectHostProcessor flag is specified.
- */
- PaWasapiHostProcessorCallback hostProcessorOutput;
- PaWasapiHostProcessorCallback hostProcessorInput;
-
- /** Specifies thread priority explicitly. Will be used only if paWinWasapiThreadPriority flag
- is specified.
-
- 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.
- */
- PaWasapiThreadPriority threadPriority;
-
- /** Stream category.
- @see PaWasapiStreamCategory
- @version Available as of 19.6.0
- */
- PaWasapiStreamCategory streamCategory;
-
- /** Stream option.
- @see PaWasapiStreamOption
- @version Available as of 19.6.0
- */
- PaWasapiStreamOption streamOption;
-}
-PaWasapiStreamInfo;
-
-
-/** 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 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 descriptor
- or, a PaErrorCode (which is always negative) if PortAudio is not initialized
- or an error is encountered.
-*/
-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 );
-
-
-/** Boost thread priority of calling thread (MMCSS).
-
- Use it for Blocking Interface only inside the thread which makes calls to Pa_WriteStream/Pa_ReadStream.
-
- @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 **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.
-
- @param pTask Task handle obtained by PaWasapi_BoostThreadPriority method.
-
- @return Error code indicating success or failure.
- @see PaWasapi_BoostThreadPriority
-*/
-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.
-
- @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.
-
- @return Error code indicating success or failure.
- @see PaWasapiHostProcessorCallback
-*/
-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.
-
- @return Error code indicating success or failure.
- @see PaWasapi_GetJackDescription
- */
-PaError PaWasapi_GetJackCount( PaDeviceIndex device, int *pJackCount );
-
-
-/** 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.
-
- @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 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.
-
- Exclusive Mode:
-
- Exclusive mode allows to deliver audio data directly to hardware bypassing
- software mixing.
- Exclusive mode is specified by 'paWinWasapiExclusive' flag.
-
- Callback Interface:
-
- 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 specifying 'paWinWasapiPolling' flag. Our WASAPI 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
- 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
- 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.
-
- 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
- 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 */