From 38eba25bccee5e9d1da07afa4c41e50f87f4b3b3 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Tue, 9 Feb 2021 14:55:41 +1100 Subject: [PATCH] WASAPI: Add PaWaspi_GetIMMDevice function The IMMDevice pointer enables access to audio device capabiltiies not exposed by PortAudio. https://docs.microsoft.com/en-us/windows/win32/api/mmdeviceapi/nn-mmdeviceapi-immdevice --- build/msvc/portaudio.def | 1 + cmake_support/template_portaudio.def | 1 + include/pa_win_wasapi.h | 10 ++++++++++ src/hostapi/wasapi/pa_win_wasapi.c | 21 +++++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/build/msvc/portaudio.def b/build/msvc/portaudio.def index 8f1738f..6ecb142 100644 --- a/build/msvc/portaudio.def +++ b/build/msvc/portaudio.def @@ -55,3 +55,4 @@ PaWasapi_GetJackDescription @66 PaWasapi_SetStreamStateHandler @68 PaWasapiWinrt_SetDefaultDeviceId @67 PaWasapiWinrt_PopulateDeviceList @69 +PaWasapi_GetIMMDevice @70 diff --git a/cmake_support/template_portaudio.def b/cmake_support/template_portaudio.def index 462c4ca..9cf0dc3 100644 --- a/cmake_support/template_portaudio.def +++ b/cmake_support/template_portaudio.def @@ -58,3 +58,4 @@ PaUtil_SetDebugPrintFunction @55 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_SetStreamStateHandler @68 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapiWinrt_SetDefaultDeviceId @67 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapiWinrt_PopulateDeviceList @69 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetIMMDevice @70 diff --git a/include/pa_win_wasapi.h b/include/pa_win_wasapi.h index a3d82ee..c046afd 100644 --- a/include/pa_win_wasapi.h +++ b/include/pa_win_wasapi.h @@ -437,6 +437,16 @@ int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDevic 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. diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 34fb52b..edb252d 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -2614,6 +2614,27 @@ int PaWasapi_GetDeviceRole( PaDeviceIndex device ) return paWasapi->devInfo[ index ].formFactor; } +// ------------------------------------------------------------------------------------------ +int PaWasapi_GetIMMDevice( PaDeviceIndex device, void **pIMMDevice ) +{ + PaError ret; + PaDeviceIndex index; + + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; + + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); + if (ret != paNoError) + return ret; + + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + *pIMMDevice = paWasapi->devInfo[ index ].device; + return paNoError; +} + // ------------------------------------------------------------------------------------------ PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *pInput, unsigned int *pOutput ) { -- 2.43.0