diff --git a/lib-src/portaudio-v19/include/pa_win_wasapi.h b/lib-src/portaudio-v19/include/pa_win_wasapi.h index 64eb49b02..1fbb51c75 100644 --- a/lib-src/portaudio-v19/include/pa_win_wasapi.h +++ b/lib-src/portaudio-v19/include/pa_win_wasapi.h @@ -263,6 +263,16 @@ int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, Pa int/*PaWasapiDeviceRole*/ PaWasapi_GetDeviceRole( PaDeviceIndex nDevice ); +/** Returns device loopback indicator. + + @param nDevice device index. + + @return 0 = Not loopback, 1 = loopback, < 0 = PaErrorCode + if PortAudio is not initialized or an error is encountered. +*/ +int PaWasapi_IsLoopback( PaDeviceIndex nDevice ); + + /** Boost thread priority of calling thread (MMCSS). Use it for Blocking Interface only for thread which makes calls to Pa_WriteStream/Pa_ReadStream. diff --git a/lib-src/portaudio-v19/src/hostapi/wasapi/pa_win_wasapi.c b/lib-src/portaudio-v19/src/hostapi/wasapi/pa_win_wasapi.c index 7bc32b8c8..0d52c073b 100644 --- a/lib-src/portaudio-v19/src/hostapi/wasapi/pa_win_wasapi.c +++ b/lib-src/portaudio-v19/src/hostapi/wasapi/pa_win_wasapi.c @@ -357,6 +357,9 @@ typedef struct PaWasapiDeviceInfo // Formfactor EndpointFormFactor formFactor; + + // Loopback indicator + int loopBack; } PaWasapiDeviceInfo; @@ -1403,6 +1406,8 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd memcpy(&paWasapi->devInfo[i + 1], &paWasapi->devInfo[i], sizeof(*paWasapi->devInfo)); i++; + paWasapi->devInfo[i].loopBack = 1; + deviceInfo = &deviceInfoArray[i]; deviceInfo->maxInputChannels = deviceInfo->maxOutputChannels; @@ -1579,6 +1584,29 @@ int PaWasapi_GetDeviceRole( PaDeviceIndex nDevice ) return paWasapi->devInfo[ index ].formFactor; } +// ------------------------------------------------------------------------------------------ +int PaWasapi_IsLoopback( PaDeviceIndex nDevice ) +{ + PaError ret; + PaDeviceIndex index; + + // Get API + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; + + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + if (ret != paNoError) + return ret; + + // Validate index + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + return paWasapi->devInfo[ index ].loopBack; +} + // ------------------------------------------------------------------------------------------ PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *nInput, unsigned int *nOutput ) { diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 05dd9af98..51fb5b96f 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -7,6 +7,10 @@ ******************************************************************/ #include "portaudio.h" +#ifdef __WXMSW__ +#include "pa_win_wasapi.h" +#endif + #ifdef USE_PORTMIXER #include "portmixer.h" #endif @@ -281,6 +285,10 @@ void DeviceManager::Rescan() } if (info->maxInputChannels > 0) { +#ifdef __WXMSW__ + if (Pa_GetHostApiInfo(info->hostApi)->type != paWASAPI || + PaWasapi_IsLoopback(i) > 0) +#endif AddSources(i, info->defaultSampleRate, &mInputDeviceSourceMaps, 1); } }