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:
parent
a1479a5c9d
commit
a9248a2f69
1 changed files with 21 additions and 14 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue