winecoreaudio.drv: Improve IsFormatSupported handling.

This commit is contained in:
Andrew Eikum 2012-12-03 10:28:07 -06:00 committed by Alexandre Julliard
parent e84f05bcbc
commit af20740d07
1 changed files with 41 additions and 6 deletions

View File

@ -1131,6 +1131,12 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient *iface,
if( duration < 3 * period)
duration = 3 * period;
}else{
if(fmt->wFormatTag == WAVE_FORMAT_EXTENSIBLE){
if(((WAVEFORMATEXTENSIBLE*)fmt)->dwChannelMask == 0 ||
((WAVEFORMATEXTENSIBLE*)fmt)->dwChannelMask & SPEAKER_RESERVED)
return AUDCLNT_E_UNSUPPORTED_FORMAT;
}
if(!period)
period = DefaultPeriod; /* not minimum */
if(period < MinimumPeriod || period > 5000000)
@ -1445,12 +1451,31 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface,
dump_fmt(pwfx);
if(outpwfx)
if(outpwfx){
*outpwfx = NULL;
if(mode != AUDCLNT_SHAREMODE_SHARED)
outpwfx = NULL;
}
if(pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
fmtex->dwChannelMask != 0 &&
fmtex->dwChannelMask != get_channel_mask(pwfx->nChannels))
if(pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE){
if(pwfx->nAvgBytesPerSec == 0 ||
pwfx->nBlockAlign == 0 ||
fmtex->Samples.wValidBitsPerSample > pwfx->wBitsPerSample)
return E_INVALIDARG;
if(fmtex->Samples.wValidBitsPerSample < pwfx->wBitsPerSample)
goto unsupported;
if(mode == AUDCLNT_SHAREMODE_EXCLUSIVE){
if(fmtex->dwChannelMask == 0 ||
fmtex->dwChannelMask & SPEAKER_RESERVED)
goto unsupported;
}
}
if(pwfx->nBlockAlign != pwfx->nChannels * pwfx->wBitsPerSample / 8 ||
pwfx->nAvgBytesPerSec != pwfx->nBlockAlign * pwfx->nSamplesPerSec)
goto unsupported;
if(pwfx->nChannels == 0)
return AUDCLNT_E_UNSUPPORTED_FORMAT;
OSSpinLockLock(&This->lock);
@ -1462,10 +1487,20 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface,
TRACE("returning %08x\n", S_OK);
return S_OK;
}
OSSpinLockUnlock(&This->lock);
if(hr != AUDCLNT_E_UNSUPPORTED_FORMAT){
TRACE("returning %08x\n", hr);
return hr;
}
unsupported:
if(outpwfx){
hr = IAudioClient_GetMixFormat(&This->IAudioClient_iface, outpwfx);
if(FAILED(hr))
return hr;
return S_FALSE;
}
TRACE("returning %08x\n", AUDCLNT_E_UNSUPPORTED_FORMAT);
return AUDCLNT_E_UNSUPPORTED_FORMAT;
}