hotplug wmme: clarify confusing device append logic in ScanDeviceInfos(): instead of using newDeviceCount for three different purposes, add new variables: initializedInfosCount (counts the number of currently valid device infos), deviceIndex (index of device whose info is being initialized).

This commit is contained in:
Ross Bencina 2016-09-18 16:33:08 +10:00
commit a9248a2f69

View file

@ -1413,6 +1413,7 @@ static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaH
int inputDeviceCount, outputDeviceCount; int inputDeviceCount, outputDeviceCount;
int maximumPossibleDeviceCount; int maximumPossibleDeviceCount;
PaWinMmeDeviceInfo *deviceInfoArray; PaWinMmeDeviceInfo *deviceInfoArray;
int initializedInfosCount;
int deviceInfoInitializationSucceeded; int deviceInfoInitializationSucceeded;
PaTime defaultLowLatency, defaultHighLatency; PaTime defaultLowLatency, defaultHighLatency;
DWORD waveInPreferredDevice, waveOutPreferredDevice; DWORD waveInPreferredDevice, waveOutPreferredDevice;
@ -1453,6 +1454,8 @@ static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaH
(DWORD_PTR)&waveOutPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags ) != MMSYSERR_NOERROR ) (DWORD_PTR)&waveOutPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags ) != MMSYSERR_NOERROR )
waveOutPreferredDevice = WAVE_MAPPER; waveOutPreferredDevice = WAVE_MAPPER;
initializedInfosCount = 0; /* incremented after successfully appending to deviceInfoArray */
maximumPossibleDeviceCount = 0; maximumPossibleDeviceCount = 0;
#ifdef PAWIN_WMME_NO_WAVE_MAPPER #ifdef PAWIN_WMME_NO_WAVE_MAPPER
@ -1514,7 +1517,8 @@ static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaH
for( i = -1; i < inputDeviceCount; ++i ){ for( i = -1; i < inputDeviceCount; ++i ){
UINT winMmeDeviceId = (UINT)((i==-1) ? WAVE_MAPPER : i); UINT winMmeDeviceId = (UINT)((i==-1) ? WAVE_MAPPER : i);
#endif #endif
PaWinMmeDeviceInfo *wmmeDeviceInfo = &deviceInfoArray[ *newDeviceCount ]; int deviceIndex = initializedInfosCount; /* host-api local index. append at end of deviceInfoArray */
PaWinMmeDeviceInfo *wmmeDeviceInfo = &deviceInfoArray[ deviceIndex ];
PaDeviceInfo *deviceInfo = &wmmeDeviceInfo->inheritedDeviceInfo; PaDeviceInfo *deviceInfo = &wmmeDeviceInfo->inheritedDeviceInfo;
deviceInfo->structVersion = 3; deviceInfo->structVersion = 3;
deviceInfo->hostApi = hostApiIndex; deviceInfo->hostApi = hostApiIndex;
@ -1541,22 +1545,23 @@ static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaH
if( outArgument->defaultInputDevice == paNoDevice ) if( outArgument->defaultInputDevice == paNoDevice )
{ {
/* if there is currently no default device, use the first one available */ /* if there is currently no default device, use the first one available */
outArgument->defaultInputDevice = *newDeviceCount; outArgument->defaultInputDevice = deviceIndex;
} }
else if( winMmeDeviceId == waveInPreferredDevice ) else if( winMmeDeviceId == waveInPreferredDevice )
{ {
/* set the default device to the system preferred device */ /* set the default device to the system preferred device */
outArgument->defaultInputDevice = *newDeviceCount; outArgument->defaultInputDevice = deviceIndex;
} }
deviceInfo->connectionId = AssignDeviceConnectionId( deviceInfo->connectionId = AssignDeviceConnectionId(
hostApi->deviceInfos, hostApi->info.deviceCount, hostApi->deviceInfos, hostApi->info.deviceCount,
outArgument->deviceInfos, *newDeviceCount, outArgument->deviceInfos, initializedInfosCount,
wmmeDeviceInfo->deviceInterfaceName, /* isInput= */ 1 ); wmmeDeviceInfo->deviceInterfaceName, /* isInput= */ 1 );
outArgument->deviceInfos[ *newDeviceCount ] = deviceInfo; outArgument->deviceInfos[ deviceIndex ] = deviceInfo;
outArgument->inputDeviceCount++; outArgument->inputDeviceCount++;
(*newDeviceCount)++; initializedInfosCount++;
} }
} }
} }
@ -1570,7 +1575,8 @@ static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaH
for( i = -1; i < outputDeviceCount; ++i ){ for( i = -1; i < outputDeviceCount; ++i ){
UINT winMmeDeviceId = (UINT)((i==-1) ? WAVE_MAPPER : i); UINT winMmeDeviceId = (UINT)((i==-1) ? WAVE_MAPPER : i);
#endif #endif
PaWinMmeDeviceInfo *wmmeDeviceInfo = &deviceInfoArray[ *newDeviceCount ]; int deviceIndex = initializedInfosCount; /* host-api local index. append at end of deviceInfoArray */
PaWinMmeDeviceInfo *wmmeDeviceInfo = &deviceInfoArray[ deviceIndex ];
PaDeviceInfo *deviceInfo = &wmmeDeviceInfo->inheritedDeviceInfo; PaDeviceInfo *deviceInfo = &wmmeDeviceInfo->inheritedDeviceInfo;
deviceInfo->structVersion = 3; deviceInfo->structVersion = 3;
deviceInfo->hostApi = hostApiIndex; deviceInfo->hostApi = hostApiIndex;
@ -1597,37 +1603,38 @@ static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaH
if( outArgument->defaultOutputDevice == paNoDevice ) if( outArgument->defaultOutputDevice == paNoDevice )
{ {
/* if there is currently no default device, use the first one available */ /* if there is currently no default device, use the first one available */
outArgument->defaultOutputDevice = *newDeviceCount; outArgument->defaultOutputDevice = deviceIndex;
} }
else if( winMmeDeviceId == waveOutPreferredDevice ) else if( winMmeDeviceId == waveOutPreferredDevice )
{ {
/* set the default device to the system preferred device */ /* set the default device to the system preferred device */
outArgument->defaultOutputDevice = *newDeviceCount; outArgument->defaultOutputDevice = deviceIndex;
} }
deviceInfo->connectionId = AssignDeviceConnectionId( deviceInfo->connectionId = AssignDeviceConnectionId(
hostApi->deviceInfos, hostApi->info.deviceCount, hostApi->deviceInfos, hostApi->info.deviceCount,
outArgument->deviceInfos, *newDeviceCount, outArgument->deviceInfos, initializedInfosCount,
wmmeDeviceInfo->deviceInterfaceName, /* isInput= */ 0 ); wmmeDeviceInfo->deviceInterfaceName, /* isInput= */ 0 );
outArgument->deviceInfos[ *newDeviceCount ] = deviceInfo; outArgument->deviceInfos[ deviceIndex ] = deviceInfo;
outArgument->outputDeviceCount++; outArgument->outputDeviceCount++;
(*newDeviceCount)++; initializedInfosCount++;
} }
} }
} }
} }
*newDeviceCount = initializedInfosCount;
*scanResults = outArgument; *scanResults = outArgument;
return result; return result;
error: error:
if( outArgument ) if( outArgument )
{ {
FreeDeviceInfos( winMmeHostApi->allocations, outArgument->deviceInfos, *newDeviceCount ); FreeDeviceInfos( winMmeHostApi->allocations, outArgument->deviceInfos, initializedInfosCount );
} }
*newDeviceCount = 0;
return result; return result;
} }