Merge pull request #509 from PortAudio/winrt

wasapi: Fixed compilation for UWP platform, minor cleanup and refactoring.
This commit is contained in:
Dmitry Kostjuchenko 2021-02-16 12:54:24 +02:00 committed by GitHub
commit 8ccd53fe7c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2525,73 +2525,7 @@ int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) static PaError _GetWasapiDeviceInfoByDeviceIndex( PaWasapiDeviceInfo **info, PaDeviceIndex device )
{
PaError ret;
PaWasapiHostApiRepresentation *paWasapi;
UINT32 size;
PaDeviceIndex index;
if (pFormat == NULL)
return paBadBufferPtr;
if (formatSize <= 0)
return paBufferTooSmall;
// Get API
paWasapi = _GetHostApi(&ret);
if (paWasapi == NULL)
return ret;
// Get device index
ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep);
if (ret != paNoError)
return ret;
// Validate index
if ((UINT32)index >= paWasapi->deviceCount)
return paInvalidDevice;
size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].DefaultFormat));
memcpy(pFormat, &paWasapi->devInfo[ index ].DefaultFormat, size);
return size;
}
// ------------------------------------------------------------------------------------------
int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device )
{
PaError ret;
PaWasapiHostApiRepresentation *paWasapi;
UINT32 size;
PaDeviceIndex index;
if (pFormat == NULL)
return paBadBufferPtr;
if (formatSize <= 0)
return paBufferTooSmall;
// Get API
paWasapi = _GetHostApi(&ret);
if (paWasapi == NULL)
return ret;
// Get device index
ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep);
if (ret != paNoError)
return ret;
// Validate index
if ((UINT32)index >= paWasapi->deviceCount)
return paInvalidDevice;
size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].MixFormat));
memcpy(pFormat, &paWasapi->devInfo[ index ].MixFormat, size);
return size;
}
// ------------------------------------------------------------------------------------------
int PaWasapi_GetDeviceRole( PaDeviceIndex device )
{ {
PaError ret; PaError ret;
PaDeviceIndex index; PaDeviceIndex index;
@ -2602,36 +2536,93 @@ int PaWasapi_GetDeviceRole( PaDeviceIndex device )
return paNotInitialized; return paNotInitialized;
// Get device index // Get device index
ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if ((ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep)) != paNoError)
if (ret != paNoError)
return ret; return ret;
// Validate index // Validate index
if ((UINT32)index >= paWasapi->deviceCount) if ((UINT32)index >= paWasapi->deviceCount)
return paInvalidDevice; return paInvalidDevice;
return paWasapi->devInfo[ index ].formFactor; (*info) = &paWasapi->devInfo[ index ];
return paNoError;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
int PaWasapi_GetIMMDevice( PaDeviceIndex device, void **pIMMDevice ) int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device )
{ {
PaError ret; PaError ret;
PaDeviceIndex index; PaWasapiDeviceInfo *deviceInfo;
UINT32 size;
PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); if (pFormat == NULL)
if (paWasapi == NULL) return paBadBufferPtr;
return paNotInitialized; if (formatSize <= 0)
return paBufferTooSmall;
ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError)
if (ret != paNoError) return ret;
return ret;
if ((UINT32)index >= paWasapi->deviceCount) size = min(formatSize, (UINT32)sizeof(deviceInfo->DefaultFormat));
return paInvalidDevice; memcpy(pFormat, &deviceInfo->DefaultFormat, size);
*pIMMDevice = paWasapi->devInfo[ index ].device; return size;
return paNoError; }
// ------------------------------------------------------------------------------------------
int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device )
{
PaError ret;
PaWasapiDeviceInfo *deviceInfo;
UINT32 size;
if (pFormat == NULL)
return paBadBufferPtr;
if (formatSize <= 0)
return paBufferTooSmall;
if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError)
return ret;
size = min(formatSize, (UINT32)sizeof(deviceInfo->MixFormat));
memcpy(pFormat, &deviceInfo->MixFormat, size);
return size;
}
// ------------------------------------------------------------------------------------------
int PaWasapi_GetDeviceRole( PaDeviceIndex device )
{
PaError ret;
PaWasapiDeviceInfo *deviceInfo;
if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError)
return ret;
return deviceInfo->formFactor;
}
// ------------------------------------------------------------------------------------------
PaError PaWasapi_GetIMMDevice( PaDeviceIndex device, void **pIMMDevice )
{
#ifndef PA_WINRT
PaError ret;
PaWasapiDeviceInfo *deviceInfo;
if (pIMMDevice == NULL)
return paBadBufferPtr;
if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError)
return ret;
(*pIMMDevice) = deviceInfo->device;
return paNoError;
#else
(void)device;
(void)pIMMDevice;
return paIncompatibleStreamHostApi;
#endif
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
@ -5197,7 +5188,7 @@ PaError PaWasapi_GetJackCount(PaDeviceIndex device, int *pJackCount)
#ifndef PA_WINRT #ifndef PA_WINRT
PaError ret; PaError ret;
HRESULT hr = S_OK; HRESULT hr = S_OK;
PaDeviceIndex index; PaWasapiDeviceInfo *deviceInfo;
IDeviceTopology *pDeviceTopology = NULL; IDeviceTopology *pDeviceTopology = NULL;
IConnector *pConnFrom = NULL; IConnector *pConnFrom = NULL;
IConnector *pConnTo = NULL; IConnector *pConnTo = NULL;
@ -5205,24 +5196,14 @@ PaError PaWasapi_GetJackCount(PaDeviceIndex device, int *pJackCount)
IKsJackDescription *pJackDesc = NULL; IKsJackDescription *pJackDesc = NULL;
UINT jackCount = 0; UINT jackCount = 0;
PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret);
if (paWasapi == NULL)
return paNotInitialized;
if (pJackCount == NULL) if (pJackCount == NULL)
return paUnanticipatedHostError; return paUnanticipatedHostError;
// Get device index if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError)
ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep);
if (ret != paNoError)
return ret; return ret;
// Validate index
if ((UINT32)index >= paWasapi->deviceCount)
return paInvalidDevice;
// Get the endpoint device's IDeviceTopology interface // Get the endpoint device's IDeviceTopology interface
hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, hr = IMMDevice_Activate(deviceInfo->device, &pa_IID_IDeviceTopology,
CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology);
IF_FAILED_JUMP(hr, error); IF_FAILED_JUMP(hr, error);
@ -5372,7 +5353,7 @@ PaError PaWasapi_GetJackDescription(PaDeviceIndex device, int jackIndex, PaWasap
#ifndef PA_WINRT #ifndef PA_WINRT
PaError ret; PaError ret;
HRESULT hr = S_OK; HRESULT hr = S_OK;
PaDeviceIndex index; PaWasapiDeviceInfo *deviceInfo;
IDeviceTopology *pDeviceTopology = NULL; IDeviceTopology *pDeviceTopology = NULL;
IConnector *pConnFrom = NULL; IConnector *pConnFrom = NULL;
IConnector *pConnTo = NULL; IConnector *pConnTo = NULL;
@ -5380,21 +5361,11 @@ PaError PaWasapi_GetJackDescription(PaDeviceIndex device, int jackIndex, PaWasap
IKsJackDescription *pJackDesc = NULL; IKsJackDescription *pJackDesc = NULL;
KSJACK_DESCRIPTION jack = { 0 }; KSJACK_DESCRIPTION jack = { 0 };
PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError)
if (paWasapi == NULL)
return paNotInitialized;
// Get device index
ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep);
if (ret != paNoError)
return ret; return ret;
// Validate index
if ((UINT32)index >= paWasapi->deviceCount)
return paInvalidDevice;
// Get the endpoint device's IDeviceTopology interface // Get the endpoint device's IDeviceTopology interface
hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, hr = IMMDevice_Activate(deviceInfo->device, &pa_IID_IDeviceTopology,
CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology);
IF_FAILED_JUMP(hr, error); IF_FAILED_JUMP(hr, error);