annotate win64-msvc/include/pa_win_wasapi.h @ 45:d530e058a1c1

64-bit MSVC builds
author Chris Cannam
date Tue, 18 Oct 2016 15:59:23 +0100
parents
children 95867ba8caa8
rev   line source
Chris@45 1 #ifndef PA_WIN_WASAPI_H
Chris@45 2 #define PA_WIN_WASAPI_H
Chris@45 3 /*
Chris@45 4 * $Id: $
Chris@45 5 * PortAudio Portable Real-Time Audio Library
Chris@45 6 * DirectSound specific extensions
Chris@45 7 *
Chris@45 8 * Copyright (c) 1999-2007 Ross Bencina and Phil Burk
Chris@45 9 *
Chris@45 10 * Permission is hereby granted, free of charge, to any person obtaining
Chris@45 11 * a copy of this software and associated documentation files
Chris@45 12 * (the "Software"), to deal in the Software without restriction,
Chris@45 13 * including without limitation the rights to use, copy, modify, merge,
Chris@45 14 * publish, distribute, sublicense, and/or sell copies of the Software,
Chris@45 15 * and to permit persons to whom the Software is furnished to do so,
Chris@45 16 * subject to the following conditions:
Chris@45 17 *
Chris@45 18 * The above copyright notice and this permission notice shall be
Chris@45 19 * included in all copies or substantial portions of the Software.
Chris@45 20 *
Chris@45 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@45 22 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@45 23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Chris@45 24 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
Chris@45 25 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@45 26 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@45 27 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@45 28 */
Chris@45 29
Chris@45 30 /*
Chris@45 31 * The text above constitutes the entire PortAudio license; however,
Chris@45 32 * the PortAudio community also makes the following non-binding requests:
Chris@45 33 *
Chris@45 34 * Any person wishing to distribute modifications to the Software is
Chris@45 35 * requested to send the modifications to the original developer so that
Chris@45 36 * they can be incorporated into the canonical version. It is also
Chris@45 37 * requested that these non-binding requests be included along with the
Chris@45 38 * license above.
Chris@45 39 */
Chris@45 40
Chris@45 41 /** @file
Chris@45 42 @ingroup public_header
Chris@45 43 @brief WASAPI-specific PortAudio API extension header file.
Chris@45 44 */
Chris@45 45
Chris@45 46 #include "portaudio.h"
Chris@45 47 #include "pa_win_waveformat.h"
Chris@45 48
Chris@45 49 #ifdef __cplusplus
Chris@45 50 extern "C"
Chris@45 51 {
Chris@45 52 #endif /* __cplusplus */
Chris@45 53
Chris@45 54
Chris@45 55 /* Setup flags */
Chris@45 56 typedef enum PaWasapiFlags
Chris@45 57 {
Chris@45 58 /* puts WASAPI into exclusive mode */
Chris@45 59 paWinWasapiExclusive = (1 << 0),
Chris@45 60
Chris@45 61 /* allows to skip internal PA processing completely */
Chris@45 62 paWinWasapiRedirectHostProcessor = (1 << 1),
Chris@45 63
Chris@45 64 /* assigns custom channel mask */
Chris@45 65 paWinWasapiUseChannelMask = (1 << 2),
Chris@45 66
Chris@45 67 /* selects non-Event driven method of data read/write
Chris@45 68 Note: WASAPI Event driven core is capable of 2ms latency!!!, but Polling
Chris@45 69 method can only provide 15-20ms latency. */
Chris@45 70 paWinWasapiPolling = (1 << 3),
Chris@45 71
Chris@45 72 /* forces custom thread priority setting. must be used if PaWasapiStreamInfo::threadPriority
Chris@45 73 is set to custom value. */
Chris@45 74 paWinWasapiThreadPriority = (1 << 4)
Chris@45 75 }
Chris@45 76 PaWasapiFlags;
Chris@45 77 #define paWinWasapiExclusive (paWinWasapiExclusive)
Chris@45 78 #define paWinWasapiRedirectHostProcessor (paWinWasapiRedirectHostProcessor)
Chris@45 79 #define paWinWasapiUseChannelMask (paWinWasapiUseChannelMask)
Chris@45 80 #define paWinWasapiPolling (paWinWasapiPolling)
Chris@45 81 #define paWinWasapiThreadPriority (paWinWasapiThreadPriority)
Chris@45 82
Chris@45 83
Chris@45 84 /* Host processor. Allows to skip internal PA processing completely.
Chris@45 85 You must set paWinWasapiRedirectHostProcessor flag to PaWasapiStreamInfo::flags member
Chris@45 86 in order to have host processor redirected to your callback.
Chris@45 87 Use with caution! inputFrames and outputFrames depend solely on final device setup.
Chris@45 88 To query maximal values of inputFrames/outputFrames use PaWasapi_GetFramesPerHostBuffer.
Chris@45 89 */
Chris@45 90 typedef void (*PaWasapiHostProcessorCallback) (void *inputBuffer, long inputFrames,
Chris@45 91 void *outputBuffer, long outputFrames,
Chris@45 92 void *userData);
Chris@45 93
Chris@45 94 /* Device role */
Chris@45 95 typedef enum PaWasapiDeviceRole
Chris@45 96 {
Chris@45 97 eRoleRemoteNetworkDevice = 0,
Chris@45 98 eRoleSpeakers,
Chris@45 99 eRoleLineLevel,
Chris@45 100 eRoleHeadphones,
Chris@45 101 eRoleMicrophone,
Chris@45 102 eRoleHeadset,
Chris@45 103 eRoleHandset,
Chris@45 104 eRoleUnknownDigitalPassthrough,
Chris@45 105 eRoleSPDIF,
Chris@45 106 eRoleHDMI,
Chris@45 107 eRoleUnknownFormFactor
Chris@45 108 }
Chris@45 109 PaWasapiDeviceRole;
Chris@45 110
Chris@45 111
Chris@45 112 /* Jack connection type */
Chris@45 113 typedef enum PaWasapiJackConnectionType
Chris@45 114 {
Chris@45 115 eJackConnTypeUnknown,
Chris@45 116 eJackConnType3Point5mm,
Chris@45 117 eJackConnTypeQuarter,
Chris@45 118 eJackConnTypeAtapiInternal,
Chris@45 119 eJackConnTypeRCA,
Chris@45 120 eJackConnTypeOptical,
Chris@45 121 eJackConnTypeOtherDigital,
Chris@45 122 eJackConnTypeOtherAnalog,
Chris@45 123 eJackConnTypeMultichannelAnalogDIN,
Chris@45 124 eJackConnTypeXlrProfessional,
Chris@45 125 eJackConnTypeRJ11Modem,
Chris@45 126 eJackConnTypeCombination
Chris@45 127 }
Chris@45 128 PaWasapiJackConnectionType;
Chris@45 129
Chris@45 130
Chris@45 131 /* Jack geometric location */
Chris@45 132 typedef enum PaWasapiJackGeoLocation
Chris@45 133 {
Chris@45 134 eJackGeoLocUnk = 0,
Chris@45 135 eJackGeoLocRear = 0x1, /* matches EPcxGeoLocation::eGeoLocRear */
Chris@45 136 eJackGeoLocFront,
Chris@45 137 eJackGeoLocLeft,
Chris@45 138 eJackGeoLocRight,
Chris@45 139 eJackGeoLocTop,
Chris@45 140 eJackGeoLocBottom,
Chris@45 141 eJackGeoLocRearPanel,
Chris@45 142 eJackGeoLocRiser,
Chris@45 143 eJackGeoLocInsideMobileLid,
Chris@45 144 eJackGeoLocDrivebay,
Chris@45 145 eJackGeoLocHDMI,
Chris@45 146 eJackGeoLocOutsideMobileLid,
Chris@45 147 eJackGeoLocATAPI,
Chris@45 148 eJackGeoLocReserved5,
Chris@45 149 eJackGeoLocReserved6,
Chris@45 150 }
Chris@45 151 PaWasapiJackGeoLocation;
Chris@45 152
Chris@45 153
Chris@45 154 /* Jack general location */
Chris@45 155 typedef enum PaWasapiJackGenLocation
Chris@45 156 {
Chris@45 157 eJackGenLocPrimaryBox = 0,
Chris@45 158 eJackGenLocInternal,
Chris@45 159 eJackGenLocSeparate,
Chris@45 160 eJackGenLocOther
Chris@45 161 }
Chris@45 162 PaWasapiJackGenLocation;
Chris@45 163
Chris@45 164
Chris@45 165 /* Jack's type of port */
Chris@45 166 typedef enum PaWasapiJackPortConnection
Chris@45 167 {
Chris@45 168 eJackPortConnJack = 0,
Chris@45 169 eJackPortConnIntegratedDevice,
Chris@45 170 eJackPortConnBothIntegratedAndJack,
Chris@45 171 eJackPortConnUnknown
Chris@45 172 }
Chris@45 173 PaWasapiJackPortConnection;
Chris@45 174
Chris@45 175
Chris@45 176 /* Thread priority */
Chris@45 177 typedef enum PaWasapiThreadPriority
Chris@45 178 {
Chris@45 179 eThreadPriorityNone = 0,
Chris@45 180 eThreadPriorityAudio, //!< Default for Shared mode.
Chris@45 181 eThreadPriorityCapture,
Chris@45 182 eThreadPriorityDistribution,
Chris@45 183 eThreadPriorityGames,
Chris@45 184 eThreadPriorityPlayback,
Chris@45 185 eThreadPriorityProAudio, //!< Default for Exclusive mode.
Chris@45 186 eThreadPriorityWindowManager
Chris@45 187 }
Chris@45 188 PaWasapiThreadPriority;
Chris@45 189
Chris@45 190
Chris@45 191 /* Stream descriptor. */
Chris@45 192 typedef struct PaWasapiJackDescription
Chris@45 193 {
Chris@45 194 unsigned long channelMapping;
Chris@45 195 unsigned long color; /* derived from macro: #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) */
Chris@45 196 PaWasapiJackConnectionType connectionType;
Chris@45 197 PaWasapiJackGeoLocation geoLocation;
Chris@45 198 PaWasapiJackGenLocation genLocation;
Chris@45 199 PaWasapiJackPortConnection portConnection;
Chris@45 200 unsigned int isConnected;
Chris@45 201 }
Chris@45 202 PaWasapiJackDescription;
Chris@45 203
Chris@45 204
Chris@45 205 /* Stream descriptor. */
Chris@45 206 typedef struct PaWasapiStreamInfo
Chris@45 207 {
Chris@45 208 unsigned long size; /**< sizeof(PaWasapiStreamInfo) */
Chris@45 209 PaHostApiTypeId hostApiType; /**< paWASAPI */
Chris@45 210 unsigned long version; /**< 1 */
Chris@45 211
Chris@45 212 unsigned long flags; /**< collection of PaWasapiFlags */
Chris@45 213
Chris@45 214 /* Support for WAVEFORMATEXTENSIBLE channel masks. If flags contains
Chris@45 215 paWinWasapiUseChannelMask this allows you to specify which speakers
Chris@45 216 to address in a multichannel stream. Constants for channelMask
Chris@45 217 are specified in pa_win_waveformat.h. Will be used only if
Chris@45 218 paWinWasapiUseChannelMask flag is specified.
Chris@45 219 */
Chris@45 220 PaWinWaveFormatChannelMask channelMask;
Chris@45 221
Chris@45 222 /* Delivers raw data to callback obtained from GetBuffer() methods skipping
Chris@45 223 internal PortAudio processing inventory completely. userData parameter will
Chris@45 224 be the same that was passed to Pa_OpenStream method. Will be used only if
Chris@45 225 paWinWasapiRedirectHostProcessor flag is specified.
Chris@45 226 */
Chris@45 227 PaWasapiHostProcessorCallback hostProcessorOutput;
Chris@45 228 PaWasapiHostProcessorCallback hostProcessorInput;
Chris@45 229
Chris@45 230 /* Specifies thread priority explicitly. Will be used only if paWinWasapiThreadPriority flag
Chris@45 231 is specified.
Chris@45 232
Chris@45 233 Please note, if Input/Output streams are opened simultaniously (Full-Duplex mode)
Chris@45 234 you shall specify same value for threadPriority or othervise one of the values will be used
Chris@45 235 to setup thread priority.
Chris@45 236 */
Chris@45 237 PaWasapiThreadPriority threadPriority;
Chris@45 238 }
Chris@45 239 PaWasapiStreamInfo;
Chris@45 240
Chris@45 241
Chris@45 242 /** Returns default sound format for device. Format is represented by PaWinWaveFormat or
Chris@45 243 WAVEFORMATEXTENSIBLE structure.
Chris@45 244
Chris@45 245 @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure.
Chris@45 246 @param nFormatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes.
Chris@45 247 @param nDevice Device index.
Chris@45 248
Chris@45 249 @return Non-negative value indicating the number of bytes copied into format decriptor
Chris@45 250 or, a PaErrorCode (which are always negative) if PortAudio is not initialized
Chris@45 251 or an error is encountered.
Chris@45 252 */
Chris@45 253 int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, PaDeviceIndex nDevice );
Chris@45 254
Chris@45 255
Chris@45 256 /** Returns device role (PaWasapiDeviceRole enum).
Chris@45 257
Chris@45 258 @param nDevice device index.
Chris@45 259
Chris@45 260 @return Non-negative value indicating device role or, a PaErrorCode (which are always negative)
Chris@45 261 if PortAudio is not initialized or an error is encountered.
Chris@45 262 */
Chris@45 263 int/*PaWasapiDeviceRole*/ PaWasapi_GetDeviceRole( PaDeviceIndex nDevice );
Chris@45 264
Chris@45 265
Chris@45 266 /** Boost thread priority of calling thread (MMCSS). Use it for Blocking Interface only for thread
Chris@45 267 which makes calls to Pa_WriteStream/Pa_ReadStream.
Chris@45 268
Chris@45 269 @param hTask Handle to pointer to priority task. Must be used with PaWasapi_RevertThreadPriority
Chris@45 270 method to revert thread priority to initial state.
Chris@45 271
Chris@45 272 @param nPriorityClass Id of thread priority of PaWasapiThreadPriority type. Specifying
Chris@45 273 eThreadPriorityNone does nothing.
Chris@45 274
Chris@45 275 @return Error code indicating success or failure.
Chris@45 276 @see PaWasapi_RevertThreadPriority
Chris@45 277 */
Chris@45 278 PaError PaWasapi_ThreadPriorityBoost( void **hTask, PaWasapiThreadPriority nPriorityClass );
Chris@45 279
Chris@45 280
Chris@45 281 /** Boost thread priority of calling thread (MMCSS). Use it for Blocking Interface only for thread
Chris@45 282 which makes calls to Pa_WriteStream/Pa_ReadStream.
Chris@45 283
Chris@45 284 @param hTask Task handle obtained by PaWasapi_BoostThreadPriority method.
Chris@45 285 @return Error code indicating success or failure.
Chris@45 286 @see PaWasapi_BoostThreadPriority
Chris@45 287 */
Chris@45 288 PaError PaWasapi_ThreadPriorityRevert( void *hTask );
Chris@45 289
Chris@45 290
Chris@45 291 /** Get number of frames per host buffer. This is maximal value of frames of WASAPI buffer which
Chris@45 292 can be locked for operations. Use this method as helper to findout maximal values of
Chris@45 293 inputFrames/outputFrames of PaWasapiHostProcessorCallback.
Chris@45 294
Chris@45 295 @param pStream Pointer to PaStream to query.
Chris@45 296 @param nInput Pointer to variable to receive number of input frames. Can be NULL.
Chris@45 297 @param nOutput Pointer to variable to receive number of output frames. Can be NULL.
Chris@45 298 @return Error code indicating success or failure.
Chris@45 299 @see PaWasapiHostProcessorCallback
Chris@45 300 */
Chris@45 301 PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *nInput, unsigned int *nOutput );
Chris@45 302
Chris@45 303
Chris@45 304 /** Get number of jacks associated with a WASAPI device. Use this method to determine if
Chris@45 305 there are any jacks associated with the provided WASAPI device. Not all audio devices
Chris@45 306 will support this capability. This is valid for both input and output devices.
Chris@45 307 @param nDevice device index.
Chris@45 308 @param jcount Number of jacks is returned in this variable
Chris@45 309 @return Error code indicating success or failure
Chris@45 310 @see PaWasapi_GetJackDescription
Chris@45 311 */
Chris@45 312 PaError PaWasapi_GetJackCount(PaDeviceIndex nDevice, int *jcount);
Chris@45 313
Chris@45 314
Chris@45 315 /** Get the jack description associated with a WASAPI device and jack number
Chris@45 316 Before this function is called, use PaWasapi_GetJackCount to determine the
Chris@45 317 number of jacks associated with device. If jcount is greater than zero, then
Chris@45 318 each jack from 0 to jcount can be queried with this function to get the jack
Chris@45 319 description.
Chris@45 320 @param nDevice device index.
Chris@45 321 @param jindex Which jack to return information
Chris@45 322 @param KSJACK_DESCRIPTION This structure filled in on success.
Chris@45 323 @return Error code indicating success or failure
Chris@45 324 @see PaWasapi_GetJackCount
Chris@45 325 */
Chris@45 326 PaError PaWasapi_GetJackDescription(PaDeviceIndex nDevice, int jindex, PaWasapiJackDescription *pJackDescription);
Chris@45 327
Chris@45 328
Chris@45 329 /*
Chris@45 330 IMPORTANT:
Chris@45 331
Chris@45 332 WASAPI is implemented for Callback and Blocking interfaces. It supports Shared and Exclusive
Chris@45 333 share modes.
Chris@45 334
Chris@45 335 Exclusive Mode:
Chris@45 336
Chris@45 337 Exclusive mode allows to deliver audio data directly to hardware bypassing
Chris@45 338 software mixing.
Chris@45 339 Exclusive mode is specified by 'paWinWasapiExclusive' flag.
Chris@45 340
Chris@45 341 Callback Interface:
Chris@45 342
Chris@45 343 Provides best audio quality with low latency. Callback interface is implemented in
Chris@45 344 two versions:
Chris@45 345
Chris@45 346 1) Event-Driven:
Chris@45 347 This is the most powerful WASAPI implementation which provides glitch-free
Chris@45 348 audio at around 3ms latency in Exclusive mode. Lowest possible latency for this mode is
Chris@45 349 3 ms for HD Audio class audio chips. For the Shared mode latency can not be
Chris@45 350 lower than 20 ms.
Chris@45 351
Chris@45 352 2) Poll-Driven:
Chris@45 353 Polling is another 2-nd method to operate with WASAPI. It is less efficient than Event-Driven
Chris@45 354 and provides latency at around 10-13ms. Polling must be used to overcome a system bug
Chris@45 355 under Windows Vista x64 when application is WOW64(32-bit) and Event-Driven method simply
Chris@45 356 times out (event handle is never signalled on buffer completion). Please note, such WOW64 bug
Chris@45 357 does not exist in Vista x86 or Windows 7.
Chris@45 358 Polling can be setup by speciying 'paWinWasapiPolling' flag. Our WASAPI implementation detects
Chris@45 359 WOW64 bug and sets 'paWinWasapiPolling' automatically.
Chris@45 360
Chris@45 361 Thread priority:
Chris@45 362
Chris@45 363 Normally thread priority is set automatically and does not require modification. Although
Chris@45 364 if user wants some tweaking thread priority can be modified by setting 'paWinWasapiThreadPriority'
Chris@45 365 flag and specifying 'PaWasapiStreamInfo::threadPriority' with value from PaWasapiThreadPriority
Chris@45 366 enum.
Chris@45 367
Chris@45 368 Blocking Interface:
Chris@45 369
Chris@45 370 Blocking interface is implemented but due to above described Poll-Driven method can not
Chris@45 371 deliver lowest possible latency. Specifying too low latency in Shared mode will result in
Chris@45 372 distorted audio although Exclusive mode adds stability.
Chris@45 373
Chris@45 374 Pa_IsFormatSupported:
Chris@45 375
Chris@45 376 To check format with correct Share Mode (Exclusive/Shared) you must supply
Chris@45 377 PaWasapiStreamInfo with flags paWinWasapiExclusive set through member of
Chris@45 378 PaStreamParameters::hostApiSpecificStreamInfo structure.
Chris@45 379
Chris@45 380 Pa_OpenStream:
Chris@45 381
Chris@45 382 To set desired Share Mode (Exclusive/Shared) you must supply
Chris@45 383 PaWasapiStreamInfo with flags paWinWasapiExclusive set through member of
Chris@45 384 PaStreamParameters::hostApiSpecificStreamInfo structure.
Chris@45 385 */
Chris@45 386
Chris@45 387 #ifdef __cplusplus
Chris@45 388 }
Chris@45 389 #endif /* __cplusplus */
Chris@45 390
Chris@45 391 #endif /* PA_WIN_WASAPI_H */