wmme host api: take account of paWinMmeWaveFormatDolbyAc3Spdif and paWinMmeWaveFormatWmaSpdif flags in Pa_IsFormatSupported
This commit is contained in:
parent
1de1b421f9
commit
eb0ad74411
1 changed files with 57 additions and 31 deletions
|
|
@ -471,6 +471,19 @@ static UINT LocalDeviceIndexToWinMmeDeviceId( PaWinMmeHostApiRepresentation *hos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int SampleFormatAndWinWmmeSpecificFlagsToLinearWaveFormatTag( PaSampleFormat sampleFormat, unsigned long winMmeSpecificFlags )
|
||||||
|
{
|
||||||
|
int waveFormatTag = PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat );
|
||||||
|
|
||||||
|
if( winMmeSpecificFlags & paWinMmeWaveFormatDolbyAc3Spdif )
|
||||||
|
waveFormatTag = PAWIN_WAVE_FORMAT_DOLBY_AC3_SPDIF;
|
||||||
|
else if( winMmeSpecificFlags & paWinMmeWaveFormatWmaSpdif )
|
||||||
|
waveFormatTag = PAWIN_WAVE_FORMAT_WMA_SPDIF;
|
||||||
|
|
||||||
|
return waveFormatTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static PaError QueryInputWaveFormatEx( int deviceId, WAVEFORMATEX *waveFormatEx )
|
static PaError QueryInputWaveFormatEx( int deviceId, WAVEFORMATEX *waveFormatEx )
|
||||||
{
|
{
|
||||||
MMRESULT mmresult;
|
MMRESULT mmresult;
|
||||||
|
|
@ -525,45 +538,55 @@ static PaError QueryOutputWaveFormatEx( int deviceId, WAVEFORMATEX *waveFormatEx
|
||||||
|
|
||||||
static PaError QueryFormatSupported( PaDeviceInfo *deviceInfo,
|
static PaError QueryFormatSupported( PaDeviceInfo *deviceInfo,
|
||||||
PaError (*waveFormatExQueryFunction)(int, WAVEFORMATEX*),
|
PaError (*waveFormatExQueryFunction)(int, WAVEFORMATEX*),
|
||||||
int winMmeDeviceId, int channels, double sampleRate )
|
int winMmeDeviceId, int channels, double sampleRate, unsigned long winMmeSpecificFlags )
|
||||||
{
|
{
|
||||||
PaWinMmeDeviceInfo *winMmeDeviceInfo = (PaWinMmeDeviceInfo*)deviceInfo;
|
PaWinMmeDeviceInfo *winMmeDeviceInfo = (PaWinMmeDeviceInfo*)deviceInfo;
|
||||||
PaWinWaveFormat waveFormat;
|
PaWinWaveFormat waveFormat;
|
||||||
|
PaSampleFormat sampleFormat;
|
||||||
|
int waveFormatTag;
|
||||||
|
|
||||||
if( sampleRate == 11025.0
|
/* @todo at the moment we only query with 16 bit sample format and directout speaker config*/
|
||||||
&& ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_1M16))
|
|
||||||
|| (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_1S16)) ) ){
|
|
||||||
|
|
||||||
return paNoError;
|
sampleFormat = paInt16;
|
||||||
|
waveFormatTag = SampleFormatAndWinWmmeSpecificFlagsToLinearWaveFormatTag( sampleFormat, winMmeSpecificFlags );
|
||||||
|
|
||||||
|
if( waveFormatTag == PaWin_SampleFormatToLinearWaveFormatTag( paInt16 ) ){
|
||||||
|
|
||||||
|
/* attempt bypass querying the device for linear formats */
|
||||||
|
|
||||||
|
if( sampleRate == 11025.0
|
||||||
|
&& ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_1M16))
|
||||||
|
|| (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_1S16)) ) ){
|
||||||
|
|
||||||
|
return paNoError;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sampleRate == 22050.0
|
||||||
|
&& ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_2M16))
|
||||||
|
|| (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_2S16)) ) ){
|
||||||
|
|
||||||
|
return paNoError;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sampleRate == 44100.0
|
||||||
|
&& ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_4M16))
|
||||||
|
|| (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_4S16)) ) ){
|
||||||
|
|
||||||
|
return paNoError;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( sampleRate == 22050.0
|
|
||||||
&& ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_2M16))
|
|
||||||
|| (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_2S16)) ) ){
|
|
||||||
|
|
||||||
return paNoError;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( sampleRate == 44100.0
|
|
||||||
&& ( (channels == 1 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_4M16))
|
|
||||||
|| (channels == 2 && (winMmeDeviceInfo->dwFormats & WAVE_FORMAT_4S16)) ) ){
|
|
||||||
|
|
||||||
return paNoError;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* first, attempt to query the device using WAVEFORMATEXTENSIBLE,
|
/* first, attempt to query the device using WAVEFORMATEXTENSIBLE,
|
||||||
if this fails we fall back to WAVEFORMATEX */
|
if this fails we fall back to WAVEFORMATEX */
|
||||||
|
|
||||||
/* @todo at the moment we only query with 16 bit sample format and directout speaker config*/
|
PaWin_InitializeWaveFormatExtensible( &waveFormat, channels, sampleFormat, waveFormatTag,
|
||||||
PaWin_InitializeWaveFormatExtensible( &waveFormat, channels,
|
|
||||||
paInt16, PaWin_SampleFormatToLinearWaveFormatTag( paInt16 ),
|
|
||||||
sampleRate, PAWIN_SPEAKER_DIRECTOUT );
|
sampleRate, PAWIN_SPEAKER_DIRECTOUT );
|
||||||
|
|
||||||
if( waveFormatExQueryFunction( winMmeDeviceId, (WAVEFORMATEX*)&waveFormat ) == paNoError )
|
if( waveFormatExQueryFunction( winMmeDeviceId, (WAVEFORMATEX*)&waveFormat ) == paNoError )
|
||||||
return paNoError;
|
return paNoError;
|
||||||
|
|
||||||
PaWin_InitializeWaveFormatEx( &waveFormat, channels, paInt16,
|
PaWin_InitializeWaveFormatEx( &waveFormat, channels, sampleFormat, waveFormatTag, sampleRate );
|
||||||
PaWin_SampleFormatToLinearWaveFormatTag( paInt16 ), sampleRate );
|
|
||||||
|
|
||||||
return waveFormatExQueryFunction( winMmeDeviceId, (WAVEFORMATEX*)&waveFormat );
|
return waveFormatExQueryFunction( winMmeDeviceId, (WAVEFORMATEX*)&waveFormat );
|
||||||
}
|
}
|
||||||
|
|
@ -585,7 +608,7 @@ static void DetectDefaultSampleRate( PaWinMmeDeviceInfo *winMmeDeviceInfo, int w
|
||||||
for( i=0; i < PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_; ++i )
|
for( i=0; i < PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_; ++i )
|
||||||
{
|
{
|
||||||
double sampleRate = defaultSampleRateSearchOrder_[ i ];
|
double sampleRate = defaultSampleRateSearchOrder_[ i ];
|
||||||
PaError paerror = QueryFormatSupported( deviceInfo, waveFormatExQueryFunction, winMmeDeviceId, maxChannels, sampleRate );
|
PaError paerror = QueryFormatSupported( deviceInfo, waveFormatExQueryFunction, winMmeDeviceId, maxChannels, sampleRate, 0 );
|
||||||
if( paerror == paNoError )
|
if( paerror == paNoError )
|
||||||
{
|
{
|
||||||
deviceInfo->defaultSampleRate = sampleRate;
|
deviceInfo->defaultSampleRate = sampleRate;
|
||||||
|
|
@ -1179,7 +1202,9 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
|
||||||
|
|
||||||
/* test for valid sample rate, see comment above */
|
/* test for valid sample rate, see comment above */
|
||||||
winMmeInputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, inputStreamInfo->devices[i].device );
|
winMmeInputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, inputStreamInfo->devices[i].device );
|
||||||
paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx, winMmeInputDeviceId, inputStreamInfo->devices[i].channelCount, sampleRate );
|
paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx,
|
||||||
|
winMmeInputDeviceId, inputStreamInfo->devices[i].channelCount, sampleRate,
|
||||||
|
((inputStreamInfo) ? inputStreamInfo->flags : 0) );
|
||||||
if( paerror != paNoError )
|
if( paerror != paNoError )
|
||||||
return paInvalidSampleRate;
|
return paInvalidSampleRate;
|
||||||
}
|
}
|
||||||
|
|
@ -1201,7 +1226,9 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
|
||||||
|
|
||||||
/* test for valid sample rate, see comment above */
|
/* test for valid sample rate, see comment above */
|
||||||
winMmeInputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, inputParameters->device );
|
winMmeInputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, inputParameters->device );
|
||||||
paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx, winMmeInputDeviceId, inputChannelCount, sampleRate );
|
paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx,
|
||||||
|
winMmeInputDeviceId, inputChannelCount, sampleRate,
|
||||||
|
((inputStreamInfo) ? inputStreamInfo->flags : 0) );
|
||||||
if( paerror != paNoError )
|
if( paerror != paNoError )
|
||||||
return paInvalidSampleRate;
|
return paInvalidSampleRate;
|
||||||
}
|
}
|
||||||
|
|
@ -1239,7 +1266,9 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
|
||||||
|
|
||||||
/* test for valid sample rate, see comment above */
|
/* test for valid sample rate, see comment above */
|
||||||
winMmeOutputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, outputStreamInfo->devices[i].device );
|
winMmeOutputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, outputStreamInfo->devices[i].device );
|
||||||
paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx, winMmeOutputDeviceId, outputStreamInfo->devices[i].channelCount, sampleRate );
|
paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx,
|
||||||
|
winMmeOutputDeviceId, outputStreamInfo->devices[i].channelCount, sampleRate,
|
||||||
|
((outputStreamInfo) ? outputStreamInfo->flags : 0) );
|
||||||
if( paerror != paNoError )
|
if( paerror != paNoError )
|
||||||
return paInvalidSampleRate;
|
return paInvalidSampleRate;
|
||||||
}
|
}
|
||||||
|
|
@ -1261,7 +1290,9 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,
|
||||||
|
|
||||||
/* test for valid sample rate, see comment above */
|
/* test for valid sample rate, see comment above */
|
||||||
winMmeOutputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, outputParameters->device );
|
winMmeOutputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, outputParameters->device );
|
||||||
paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx, winMmeOutputDeviceId, outputChannelCount, sampleRate );
|
paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx,
|
||||||
|
winMmeOutputDeviceId, outputChannelCount, sampleRate,
|
||||||
|
((outputStreamInfo) ? outputStreamInfo->flags : 0) );
|
||||||
if( paerror != paNoError )
|
if( paerror != paNoError )
|
||||||
return paInvalidSampleRate;
|
return paInvalidSampleRate;
|
||||||
}
|
}
|
||||||
|
|
@ -1749,12 +1780,7 @@ static PaError InitializeWaveHandles( PaWinMmeHostApiRepresentation *winMmeHostA
|
||||||
|
|
||||||
/* @todo at the moment we only use 16 bit sample format */
|
/* @todo at the moment we only use 16 bit sample format */
|
||||||
sampleFormat = paInt16;
|
sampleFormat = paInt16;
|
||||||
waveFormatTag = PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat );
|
waveFormatTag = SampleFormatAndWinWmmeSpecificFlagsToLinearWaveFormatTag( sampleFormat, winMmeSpecificFlags );
|
||||||
|
|
||||||
if( winMmeSpecificFlags & paWinMmeWaveFormatDolbyAc3Spdif )
|
|
||||||
waveFormatTag = PAWIN_WAVE_FORMAT_DOLBY_AC3_SPDIF;
|
|
||||||
else if( winMmeSpecificFlags & paWinMmeWaveFormatWmaSpdif )
|
|
||||||
waveFormatTag = PAWIN_WAVE_FORMAT_WMA_SPDIF;
|
|
||||||
|
|
||||||
for( i = 0; i < (signed int)deviceCount; ++i )
|
for( i = 0; i < (signed int)deviceCount; ++i )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue